首页 > 解决方案 > Java - 正则表达式 - 用星号替换地址

问题描述

试图用星号替换这个字符串。

这是我正在尝试做的事情:

之前:派克街 100 号 104 单元

变为:100 Pi** St* Un** ***

例如:

之前:派克街 100 号

变为:100 Pi** St*

我正在使用:这个正则表达式来检查是否有超过 1 个数字

(?:\d.*?){1}

String[] splitAddress = address.split("");

    Pattern pattern = Pattern.compile("(?:\\d.*?){1}");
    Matcher matcher = pattern.matcher(address);

    boolean isMatched = matcher.matches();
    System.out.println(isMatched);

我在这里做错了什么?请帮忙。谢谢!

标签: javaregex

解决方案


也许,类似于,

(?i)^(\\d+)\\s+(\\S{2}).*?\\s+St.*?(Unit\\s+\\d+)?$

可以调查一下。


您可能想if为第三个捕获组编写一个语句,该组具有Unit. 如果该组不是空的,那么您将为此连接另一个组*

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "(?i)^(\\d+)\\s+(\\S{2}).*?\\s+St.*?(Unit\\s+\\d+)?$";
        final String string = "100 Pike St. Unit 104\n"
             + "100 Pike St.\n"
             + "100 Pike and Salmon STREET Unit 104\n"
             + "100 Pike and Salmon ST.";
        final String subst = "$1 $2** St*";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        final String result = matcher.replaceAll(subst);

        System.out.println(result);


    }
}

输出

100 Pi** St*
100 Pi** St*
100 Pi** St*
100 Pi** St*

如果您希望简化/更新/探索表达式,它已在regex101.com的右上角面板中进行了说明。如果您有兴趣,可以在此调试器链接中观看匹配步骤或修改它们。调试器演示了 RegEx 引擎如何逐步使用一些示例输入字符串并执行匹配过程。


星号数

如果数量*是一个问题,那么您可能想要捕获所有内容,为此进行一些简单的计数,表达式类似于:

(?i)^(\d+)\s+(\S{2})(.*?)\s+St(.*?)\s*(Unit\s+\d+)?$ 

正则表达式演示 2

测试 2

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){


        final String regex = "(?i)^(\\d+)\\s+(\\S{2})(.*?)\\s+St(.*?)\\s*(Unit\\s+\\d+)?$";
        final String string = "100 Pike St. Unit 104\n"
             + "100 Pike St.\n"
             + "100 Pike and Salmon STREET Unit 104\n"
             + "100 Pike and Salmon ST.";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

输出 2

Full match: 100 Pike St. Unit 104
Group 1: 100
Group 2: Pi
Group 3: ke
Group 4: .
Group 5: Unit 104
Full match: 100 Pike St.
Group 1: 100
Group 2: Pi
Group 3: ke
Group 4: .
Group 5: null
Full match: 100 Pike and Salmon STREET Unit 104
Group 1: 100
Group 2: Pi
Group 3: ke and Salmon
Group 4: REET
Group 5: Unit 104
Full match: 100 Pike and Salmon ST.
Group 1: 100
Group 2: Pi
Group 3: ke and Salmon
Group 4: .
Group 5: null

正则表达式电路

jex.im可视化正则表达式:

在此处输入图像描述


推荐阅读