【问题标题】:How to match any content between two strings?如何匹配两个字符串之间的任何内容?
【发布时间】:2015-05-29 14:35:43
【问题描述】:

我想匹配两个字符串中包含的任何内容,如下所示:

teststring = %-12x (my value)

图案:

%-(.*?)x (my value)

结果应该是:

12

但是正则表达式不起作用。为什么?

【问题讨论】:

  • my 与 may 并转义 ( 和 )。
  • 使用regex101.com 进行测试。
  • “包含在两个字符串中”哪些字符串?

标签: java regex string


【解决方案1】:

您的正则表达式中有错字(my 而不是 may),您需要转义 ():

String s = "%-12x (may value)";
Matcher m = Pattern.compile("%-(.*?)x \\(may value\\)").matcher(s);
if (m.find() && m.groupCount() >= 1) System.out.println(m.group(1)); //12

【讨论】:

  • 谢谢,如果有几个像%- %- %-12x 这样的起始字符串,我只想匹配最新的%-。但目前它找到了第一个..
  • 怎么样:m.group(m.groupCount())?
  • 谢谢。是否也可以仅替换找到的组(数字)? pattern.matcher(s).replaceAll("100"); 将替换完整的内容 %-12x (my value),而不仅仅是数字。
  • @membersound 我不确定
【解决方案2】:

正则表达式不起作用,因为 ( 和 ) 是需要转义的元字符:

%-(.*?)x [(]my value[)]

如果没有[] 或\,引擎会将它们视为第二个捕获组的标记,在成功匹配时始终“捕获”"my value"。

如果您想制作适合replaceAll 的正则表达式,请删除捕获组,并使用%- 和x [(]my value[)] 作为前瞻和后瞻的一部分:

String s = "%-12x (my value)";
String r = s.replaceAll("(?<=%-).*?(?=x [(]my value[)])", "quick brown fo");
System.out.println(r); // prints "%-quick brown fox (my value)"

Demo.

【讨论】:

  • 谢谢,这行得通,因为它发现完整的内容是匹配的,而不仅仅是数字12,
  • @membersound 您必须提取捕获组。
  • @membersound 通过调用match.group(1),获取第一个capturing group 以将12 拉出比赛。
【解决方案3】:

似乎是“?”不需要,因为使用 '*' 表示任何字符必须有零个或多个。

应该是这样的%-(.*)x。

【讨论】:

    猜你喜欢
    • 2022-07-06
    • 1970-01-01
    • 2014-10-09
    • 2017-02-24
    • 1970-01-01
    • 2016-10-22
    • 2023-02-04
    • 2010-12-25
    • 2017-08-31
    相关资源
    最近更新 更多