如果您有这样的字符串:
[hello world] this is [the best .Home] is nice place.
如何仅在方括号[]内提取每个单词(用空格分隔)。 现在我有这个工作https://regex101.com/r/Tgokeq/2
返回:
你好世界
最好。家庭
但我想:
您好
世界
的
最好的
。家里
PS:我知道我可以在foreach中进行字符串拆分,但我不希望我在正则表达式本身中想要它,就像这样得到每个单词,除了我想要括号内的单词[]只要。 https://regex101.com/r/eweRWj/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]+)\ *)+]