正则表达式 - 在字符之间获取单词

时间:2011-05-24 17:19:50

标签: .net regex

给出以下示例字符串:"[ One].[Two ].[ Three ].[Four]" 我想要匹配“一个”; “两个”,“三个”和“四个”。

换句话说:无论在这个单词周围有多少个空格,我都需要在括号之间取词。

我用以下表达式尝试过它:

(?<=\[)(?s)(.*?)(?=\s*\])

这会产生" One""Two"" Three""Four"

修改 它比我第一次尝试的要复杂得多:

  1. 括号中包含许多(至少一个)单词,这些单词可能被任意字符分隔(例如"[one]""[one] [two][three].[four]")。
  2. 括号中包含一个单词和多个,甚至没有空格(例如"[one]""[two ]""[ three ]"
  3. 这些单词块和附带的括号被一组已知的字符包围: "These words [word-1] .. [word-n] are well known""These words [word-1] .. [word-n] are well known"
  4. 请注意,"[word-1] .. [word-n]"仅表示上述块的任意计数。

    我想只匹配括号中的单个单词,并消除环绕序列("These words""are well known")以及括号内和块之间可能存在的空格。另外,块之间可能存在的char(它不能只有一个)也应该被消除。 希望这不是太奇怪;)

4 个答案:

答案 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);