【问题标题】:finding sub-segment of list of words in any order using regular expression使用正则表达式以任何顺序查找单词列表的子段
【发布时间】:2012-06-21 13:13:50
【问题描述】:

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

例如

aaaa aaaa cccc cccc bbbb bbbb bbbb bbbb Bbbb Aaaa Cccc

还有话

aaaa
bbbb
cccc

那么它应该给我输出

Bbbb Aaaa Cccc

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

【问题讨论】:

  • aaa aAa aaA AAA 这样的字符串可以出现在搜索到的字符串中吗? (同一个“词”的不同变体相互跟随。)词的数量是固定的吗?
  • 是的,搜索是区分大小写的,我需要从字符串中以任何顺序查找单词序列,这将是字符串的子段。但是每个单词都包含在 sub-段..没有固定的单词...但肯定少于字符串中的单词

标签: java regex special-characters unordered


【解决方案1】:

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

(?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 检查捕获组是否包含所有单词。如果他们找到了匹配项,如果没有,请搜索下一个匹配项并重复。


你可以一直用正则表达式来解决这个问题,但你必须构造正确的表达式:

(?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 可以是匹配所有允许单词的任何表达式(不必是交替)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2015-06-02
    • 2013-12-15
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多