代码之家  ›  专栏  ›  技术社区  ›  Caveatrob

Regexp用于提取不在句子开头的大写单词和两个相邻单词

  •  2
  • Caveatrob  · 技术社区  · 15 年前

    我想找出大写的单词,这些单词不能和前面和后面的单词一起开始一个句子。

    我用的是:

    (\w*)\b([A-Z][a-z]\w*)\b(\w*)
    

    替换为:

    $1 -- $2 -- $3
    

    编辑:只退了2块钱。会尝试建议。

    关于自然语言呢?别在意这件事。我只想看看大写字母在句子中出现的位置,这样我就能知道它们是否合适。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Brendan    15 年前

    这个怎么样?

    ([a-zA-Z]+)\s([A-Z][a-z]*)\s([a-zA-Z]+)
    

    但这并没有考虑到任何非字母的内容。它还假设所有单词都由一个空白字符分隔。如果需要更复杂的支持,则需要对其进行修改。

        2
  •  1
  •   Tim Pietzcker    15 年前

    现在你的regex失败了,因为 \b 无法与之匹敌。它只在字母数字字符和非字母数字字符之间匹配;因此它不能在 \w* [A-Z] 或其他 \西* .

    因此,您的单词之间需要一些其他(=非字母数字)字符:

    尝试

    (\w*)\W+([A-Z][a-z]\w*)\W+(\w*)
    

    尽管(如果regex引擎允许使用Unicode属性),但是

    (\w*)\W+(\p{Lu}\p{Ll}\w*)\W+(\w*)
    

    如文中所述,只有长度为2或2以上的大写单词匹配,即“i”(如“me”)将不会与此匹配。我想你插入了 [a-z] 为了避免像“IBM”这样的匹配?或者你的意图是什么?