正则表达式查找包含数字的行,以文本开头,但从出现的文本中删除文本
Regex to find lines containing numbers, starting with text, but removing text from the ocurrence
有以下输入:
Testing 42702434884
Testing 064352729-13
05.994.401/0001-53
Testing 134.632.125-03
我试图获取包含数字的行,只考虑以文本开头的行,并从结果中删除文本,
目前我尝试了以下表达式:
(?!a-zA-Z)\b(\d{11}|\d{14})|(\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b
我能够从结果中删除文本,并找到包含模式的行,但无法仅过滤以文本开头的行。 Here is the result 例如
如何在从结果中删除文本的同时过滤以文本开头的行?
对您尝试的模式使用否定前瞻 (?!a-zA-Z)\b
总是正确的,因为后面是一个数字,因此可以省略。
您可以使用锚点 ^
来断言字符串的开头,并匹配 1+ 次字符 a-zA-Z 后跟 space 并使其可选 (?:[a-zA-Z]+ )?
如果你想匹配所有的例子
在所有交替周围附加一个组。
如果您不需要所有的捕获组,您可以让它们成为非捕获组 (?:
,除了您想要保留的数字。
这些值在组 1 中。
^(?:[a-zA-Z]+ )?((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)
注意 Java 双重转义反斜杠。
要仅获得 3 个匹配项,您可以使用
^[a-zA-Z]+ ((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)
不太清楚您希望如何解析数字。这对你有用吗?
- 首先它只过滤以文本开头的行。
- 然后删除第一个数字之前的所有字符。
- 并将它们存储在数组中。
String[] lines = {
"Testing 42702434884", "Testing 064352729-13", "05.994.401/0001-53",
"Testing 134.632.125-03"
};
String[] filtered =
Arrays.stream(lines).filter(k -> k.matches("^\D+.*")).map(
s -> s.replaceAll("(^\D+)", "")).toArray(String[]::new);
for (String s : filtered) {
System.out.println(s);
}
以上打印
42702434884
064352729-13
134.632.125-03
有以下输入:
Testing 42702434884
Testing 064352729-13
05.994.401/0001-53
Testing 134.632.125-03
我试图获取包含数字的行,只考虑以文本开头的行,并从结果中删除文本,
目前我尝试了以下表达式:
(?!a-zA-Z)\b(\d{11}|\d{14})|(\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b
我能够从结果中删除文本,并找到包含模式的行,但无法仅过滤以文本开头的行。 Here is the result 例如
如何在从结果中删除文本的同时过滤以文本开头的行?
对您尝试的模式使用否定前瞻 (?!a-zA-Z)\b
总是正确的,因为后面是一个数字,因此可以省略。
您可以使用锚点 ^
来断言字符串的开头,并匹配 1+ 次字符 a-zA-Z 后跟 space 并使其可选 (?:[a-zA-Z]+ )?
如果你想匹配所有的例子
在所有交替周围附加一个组。
如果您不需要所有的捕获组,您可以让它们成为非捕获组 (?:
,除了您想要保留的数字。
这些值在组 1 中。
^(?:[a-zA-Z]+ )?((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)
注意 Java 双重转义反斜杠。
要仅获得 3 个匹配项,您可以使用
^[a-zA-Z]+ ((?:\d{11}|\d{14})|(?:\d{3}\.\d{3}\.\d{3}\-\d{2}|\d{3}\d{3}\d{3}\-\d{2})|(?:\d{2}\.\d{3}.\d{3}\/\d{4}-\d{2}|\d{2}\d{3}\d{3}\d{4}-\d{2})\b)
不太清楚您希望如何解析数字。这对你有用吗?
- 首先它只过滤以文本开头的行。
- 然后删除第一个数字之前的所有字符。
- 并将它们存储在数组中。
String[] lines = {
"Testing 42702434884", "Testing 064352729-13", "05.994.401/0001-53",
"Testing 134.632.125-03"
};
String[] filtered =
Arrays.stream(lines).filter(k -> k.matches("^\D+.*")).map(
s -> s.replaceAll("(^\D+)", "")).toArray(String[]::new);
for (String s : filtered) {
System.out.println(s);
}
以上打印
42702434884
064352729-13
134.632.125-03