给出以下示例字符串:"[ One].[Two ].[ Three ].[Four]"
我想要匹配“一个”; “两个”,“三个”和“四个”。
换句话说:无论在这个单词周围有多少个空格,我都需要在括号之间取词。
我用以下表达式尝试过它:
(?<=\[)(?s)(.*?)(?=\s*\])
这会产生" One"
,"Two"
," Three"
和"Four"
。
修改 它比我第一次尝试的要复杂得多:
"[one]"
或"[one] [two][three].[four]"
)。"[one]"
或"[two ]"
或"[ three ]"
。"These words [word-1] .. [word-n] are well known"
或
"These words [word-1] .. [word-n] are well known"
。请注意,"[word-1] .. [word-n]"
仅表示上述块的任意计数。
我想只匹配括号中的单个单词,并消除环绕序列("These words"
和"are well known"
)以及括号内和块之间可能存在的空格。另外,块之间可能存在的char(它不能只有一个)也应该被消除。
希望这不是太奇怪;)
答案 0 :(得分:10)
您可以使用此功能,并启用“全局”标记
\[\s*(\S+?)\s*\]
解释
\[ # a literal "[" \s* # any number of white space (\S+?) # at least one non white-space character, non-greedily (group 1) \s* # any number of white space \] # a literal "]"
编辑:
@Kobi注意到\S+?
实际上可以匹配]
等目标中的"[ One]"
。因此,第1组将包含"One]"
。
但是在正则表达式的末尾仍然存在\]
,此时正则表达式引擎会回溯并将"]"
赋予\]
,因此表达式可以成功。
在这里使用on-greedy匹配非常重要(\S+?
,而不是\S+
)。我的答案的第一个版本也出错了。
此外,\S
非常不明确。如果您对“一个词”的具体内容有所了解 - 请务必使用它。
答案 1 :(得分:4)
非贪婪匹配是关键。请尝试以下方法:
\[\s*(.+?)\s*\]
它将匹配括号内的任何并在之前或之后没有空格的情况下捕获它。如果括号内的字符串不能有空格,我推荐以下内容,因为它是更好的表达式。
\[\s*(\S+)\s*\]
答案 2 :(得分:3)
一个简单的解决方案是使用捕获组来获得您真正想要的匹配部分:
\[\s*(.*?)\s*\]
示例:
MatchCollection matches = Regex.Matches(s, @"\[\s*(.*?)\s*\]");
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
类似的选择是使用trim:
MatchCollection matches = Regex.Matches(s, @"\[([^\]]*)\]");
string[] words = matches.Cast<Match>().Select(m => m.Groups[1].Value.Trim()).ToArray();
如果你真的想要,可以使用环视:
(?<=\[\s*)\S.*?(?=\s*\])
示例:
MatchCollection matches = Regex.Matches(s, @"(?<=\[\s*)\S.*?(?=\s*\])");
string[] words = matches.Cast<Match>().Select(m => m.Value).ToArray();
答案 3 :(得分:0)
正则表达式绝对必要吗?如果没有,我相信你可以修剪摆脱括号,点和空格。
char[] chars = new char[] {'[', ']', '.', ' '};
inputString = inputString.Trim(chars);