在Java中合并多个正则表达式

5
我已经编写了一个正则表达式,可以省略在某些字符(,和#)的第一次出现之后的所有字符。
String number = "(123) (456) (7890)#123";
number = number.replaceAll("[,#](.*)", ""); //This is the 1st regex

然后使用第二个正则表达式仅获取数字(删除空格和其他非数字字符)

number = number.replaceAll("[^0-9]+", ""); //This is the 2nd regex

输出:1234567890

如何将两个正则表达式合并成一个,就像将第一个正则表达式的输出传递到第二个正则表达式中一样。


number.match(\\d+") - Tushar
1
Try [,#].*$|[^#,0-9]+ - Wiktor Stribiżew
@WiktorStribiżew 这似乎可以工作,但是(1)不确定它是否适用于一般情况,以及(2)应该指出,在这种情况下,“|”不是“管道”符号,而是或(仅因为OP询问了关于“管道”正则表达式的问题)。 - tobias_k
@tobias_k:由于问题不是很清楚(输入示例太少,使用的正则表达式太通用),我不会发布任何答案。我只是提出了一些可能的解决方案,感谢您“解密”它,但如果OP说我的解决方案有效,我将发布所有解释。 - Wiktor Stribiżew
2个回答

2
你可以将两个正则表达式结合起来,如下所示。
String number = "(123) (456) (7890)#123";
number = number.replaceAll("[,#](.*)", "").replaceAll("[^0-9]+", "");

虽然这并没有“将两个正则表达式合并为一个”,但我认为这已经是最接近“将第一个正则表达式的输出传递给第二个”的方法了。 - tobias_k
请注意,“piping”不等于“chaining”(尽管这取决于“piping”OP的含义)。在这里,两个replaceAll方法被链接在一起。无论如何,我不太确定这里需要什么,OP很可能会误用术语。 - Wiktor Stribiżew
@WiktorStribiżew 我所说的管道是指我想首先执行正则表达式操作以删除#和,后面的字符,然后将输出定向到第二个正则表达式以删除任何非数字字符。基本上是按顺序进行。您的解决方案似乎有效。我只想确认tobias_k所指的是和/或操作而不是管道? - tech0123

1

所以您需要删除除数字以外的所有符号,并删除第一个井号或逗号后的整个字符串。

您不能只使用|操作符连接模式,因为其中一个模式在字符串末尾隐式地固定。

您需要先删除任何符号,但是要先删除数字和哈希与逗号,因为正则表达式引擎从左到右处理字符串,然后可以添加替代方案来匹配逗号或哈希以及它们后面的任何文本。如果输入中有换行符,请使用DOTALL修饰符。

使用

 (?s)[,#].*$|[^#,0-9]+

1
好的。明白了。谢谢! - tech0123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接