使用正则表达式以任何顺序查找单词列表的子段

时间:2012-06-21 13:13:51

标签: java regex special-characters unordered

我有一个单词列表,我必须找到单词的最小单词子段,忽略任何特殊的字符和数字, 此子段可以包含任何顺序的单词和不区分大小写的搜索 这个编码将在java中完成

例如。

aaaa aaaa cccc cccc bbbb bbbb bbbb bbbb Bbbb Aaaa Cccc

并且有话语

aaaa
bbbb
cccc

然后它应该给我输出

Bbbb Aaaa Cccc

我知道正则表达式(java中的正则表达式)但是,对它来说是新的,所以任何帮助都会有很大用处。

1 个答案:

答案 0 :(得分:4)

你可以做的是构建一个像这样的正则表达式:

(?i)\b(aaaa|bbbb|cccc)(?=\W+(\w+)\W+(\w+)\b)
\__/  \_____________/    \______/         \__ makes sure it's a complete word
 |           |               \____ repeat N-1 times (N = number of words)
 |           \___ all words alternated to match the first word
 \__ case insensitive matching

然后用Java检查捕获组是否包含所有单词。如果他们找到匹配项,如果没有,请搜索下一个匹配项并重复。


你可以把这一切都用regex来解决,但是你必须构造正确的表达式:

(?i)\b(words)\W+(?!\1\b)(words)\W+(?!(?:\1|\2)\b)(words)\b
       \___/ \________________/   \_____________/
         |           |                  |
  list of all the    |         lookahead has to include
  words alternated   |         all previous capturing groups
                     |
             repeat N-1 times but you have to 
             change the lookahead each time

对于许多单词来说,这将是一个非常大的表达,尽管words可以是匹配所有允许单词的任何表达式(不必是替换)。