如何编写正则表达式以查找以下模式?

时间:2010-10-20 13:14:16

标签: java regex

我正在尝试编写正则表达式来执行查找和替换操作。假设Java正则表达式语法。以下是我想要找到的例子:

  • 12341 + 1
  • 12241 + 1R1
  • 100001 + 1R2

所以,我正在搜索以一个或多个数字开头的字符串,后跟一个“1 + 1”子字符串,后跟0个或更多字符。我有以下正则表达式:

^(\d+)(1\\+1).*

这个正则表达式将成功找到上面的示例,但是,我的目标是在"1+1"之前用所有内容替换字符串。因此,12341 + 1将变为1234,而12241 + 1R1将变为1224.如果我使用第一个分组表达式$1来替换模式,我得到错误的结果如下:

  • 12341 + 1变为12341
  • 12241 + 1R1变为12241
  • 100001 + 1R2变为100001

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

您现有的正则表达式工作正常,只是在\之前错过了\d

String str = "100001+1R2";
str = str.replaceAll("^(\\d+)(1\\+1).*","$1");

Working link

答案 1 :(得分:0)

你的正则表达式看起来很好 - 我没有访问java但是在JavaScript代码..

"12341+1".replace(/(\d+)(1\+1)/g, "$1");

按照您的预期返回1234。这适用于具有许多“代码”的字符串。

"12341+1 54321+1".replace(/(\d+)(1\+1)/g, "$1"); 

给出1234 5432

答案 2 :(得分:0)

就个人而言,我根本不会使用Regex(就像在图钉上使用锤子一样),我只是从(Pseudocode)创建一个子串

stringName.substring(0, stringName.indexOf("1+1")) 

但看起来其他海报已经提到过非贪婪的算子。

在大多数Regex语法中,您可以添加“?”在“+”或“*”之后表示您希望它在模式中移动之前尽可能少地匹配。 (因此:^(\d+?)(1+1)匹配任意数量的数字,直到找到“1 + 1”,然后,不包括“1 + 1”它继续匹配,而你的原始会看到1并匹配它。

答案 3 :(得分:0)

恕我直言,正则表达式是正确的。

也许你在代码中写错了。如果要在字符串中对正则表达式^(\d+)(1\+1).*进行编码,则必须编写类似String regex = "^(\\d+)(1\\+1).*"的内容。

您的输出是^(\d+)(1+1).*替换的结果,因为您错过了字符串中的一些反斜杠(例如"^(\\d+)(1\+1).*")。