获取捕获组中的每个项目

时间:2017-08-08 00:24:04

标签: c# .net regex

如果您有这样的字符串:

[hello world] this is [the best .Home] is nice place.

如何仅在方括号[]内提取每个单词(用空格分隔)。 现在我有这个工作https://regex101.com/r/Tgokeq/2

返回

你好世界

最好。家庭

但我想:

您好

世界

最好的

。家里

PS:我知道我可以在foreach中进行字符串拆分,但我不希望我在正则表达式本身中想要它,就像这样得到每个单词,除了我想要括号内的单词[]只要。 https://regex101.com/r/eweRWj/2

2 个答案:

答案 0 :(得分:2)

使用此模式([^\[\] ]+)(?=[^\[\]]*\]) Demo

(               # Capturing Group (1)
  [^\[\] ]      # Character not in [\[\] ] Character Class
  +             # (one or more)(greedy)
)               # End of Capturing Group (1)
(?=             # Look-Ahead
  [^\[\]]       # Character not in [\[\]] Character Class
  *             # (zero or more)(greedy)
  \]            # "]"
)               # End of Look-Ahead

答案 1 :(得分:0)

这种模式可能看起来不那么优雅,因为它不能单独匹配单个单词。完整的解决方案利用.Net正则表达式库来获取单个单词。但是,它避免了alpha bravo解决方案的过度回溯。其重要性在很大程度上取决于您搜索的行数和/或您是否匹配大块文本或一次只匹配单行。

此方法还可以让您准确识别每对中捕获的括号对和哪些单词。一个简单的仅模式解决方案将为您提供没有上下文的匹配单词。

模式:

\[\s*((?<word>[^[\]\s]+)\s*)+]

然后是一些简短的代码,演示如何通过.Net正则表达式对象模型获取捕获的单词:

using System.Text.RegularExpressions;
...

Regex rx = new Regex(@"\[\s*((?<word>[^[\]\s]+)\s*)+]");
MatchCollection matches = rx.Matches(searchText);
foreach(Match m in matches) {
    foreach(Capture c in m.Groups["word"].Captures) {
        System.Console.WriteLine(c.Value);
    }
}

模式细分:

\[              # Opening bracket
  \s*           # Optional white space
  (             # Group for word delimited by space
    (?<word>    # Named capture group
      [^[\]\s]  # Negative character class: no brackets, no white space
      +         # one or more greedy
    )           # End named capture group
    \s*         # Match white space after word
  )             # End of word+space grouping
  +             # Match multiple occurrences of word+space
]               # Literal closing bracket (no need to escape outside character class)

以上内容将匹配括号之间的换行符。如果您不想这样,那么使用

\[\ *((?<word>[^[\]\s]+)\ *)+]