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

0xb*_*00d 4 .net regex

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

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

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

(?<=\[)(?s)(.*?)(?=\s*\])
Run Code Online (Sandbox Code Playgroud)

这导致" 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".

请注意,"[word-1] .. [word-n]"只代表上述块的任意计数.

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

Tom*_*lak 10

您可以使用此功能,并启用"全局"标志

\[\s*(\S+?)\s*\]
Run Code Online (Sandbox Code Playgroud)

说明

\[      # 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非常不明确.如果你有什么更具体的"一个字"对你来说 - 无论如何,使用它.