【问题标题】:Java RegEx: Extract multiple sub-strings from a stringJava RegEx:从字符串中提取多个子字符串
【发布时间】:2016-09-11 22:35:39
【问题描述】:

我想从包含在某些标签中的字符串中提取所有子字符串。例如,如果我有一个将一些子字符串包含在“*”标签中的输入字符串:

I contain two terms to extract: *first term* and *second term*

我想要得到的是两个子字符串“first term”和“second term”。 我尝试使用以下代码:

List<String> matches = new ArrayList<>();
Matcher m = Pattern.compile(".*\\*(.*)\\*.*").matcher(inputString);
while(m.find()){
   matches.add(m.group(1));
}

但这给了我不正确的结果。我阅读了有关 group 方法的 API 文档,但老实说,我不太明白它的含义以及它是如何工作的。如果有人能告诉我在这里收集所有想要的子字符串的最佳方法是什么,我将不胜感激。

谢谢!

【问题讨论】:

  • 使用\\*(.*?)\\*,即不贪心。
  • “贪婪”是什么意思?谢谢
  • “贪婪”的意思是如果有不止一种方式来获得匹配,它会选择字符数最多的匹配。如果你的正则表达式是a.*b,而你的输入字符串是a1111b...a2222b,这将匹配整个字符串,因为它会为.*选择最大的匹配。通过添加问号a.*?b,您可以告诉它选择字符数最少的匹配项。所以这将匹配a1111b

标签: java regex substring


【解决方案1】:

试试下面的表达式:

\\*([^\\*]+)\\*

所需的子字符串将在第一组中。

【讨论】:

  • 您不需要在字符类中转义*\\*([^*]+)\\*[*]([^*]+)[*] 可以。
  • 太好了,谢谢你们!但我不太明白:现在我的方法到底有什么不同?似乎是方括号的用法,但我不明白为什么它是必要的?
  • 方括号允许匹配除星号以外的任何内容,因为星号结束您要匹配的短语。有关正则表达式的更多信息,请参阅 WikiBooks 上的这篇文章:en.wikibooks.org/wiki/Regular_Expressions/… 和 StackOverflow 文档:stackoverflow.com/documentation/regex/topics
猜你喜欢
  • 1970-01-01
  • 2023-01-07
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多