除了大括号中的单词之外,我怎样才能匹配每个单词的第一个字母

时间:2016-07-04 14:01:15

标签: javascript regex

我一直在努力做到这一点。我可以匹配每个单词的第一个字母,但我不能排除大括号中的单词。

例如:

  

我不能(做)这个,请(帮助)我。

所以这应该匹配 - Ictpm - 仅限。

使用\b\w只匹配单词的第一个字母,它不会排除大括号中的单词。我也尝试过负面的预测,但似乎我不能正确地做到这一点:

(?!\(()\))\b\w

我也遇到了unicodes的问题。使用(?:^| )[a-z]{1}\b\w仅匹配拉丁字母,我有时会使用不同的unicodes,例如:

  

我是(某人)ვიღაც。

在这种情况下,正则表达式只会匹配Ias,而不是。感谢

2 个答案:

答案 0 :(得分:1)

这只抓住了第一个字母:

  

(小于?= [^(])\ B \瓦特

这是一个积极的背后:(来自https://regex101.com/

确保给定的模式匹配,从表达式中的当前位置结束。不消耗任何字符。

  

/(小于?= FOO)酒吧/

foob​​ar匹配  foob​​az不匹配

对于非拉丁语字符,我无法帮助您

答案 1 :(得分:1)

需要考虑不同的事情。

  1. 首先,您需要定义您的字母,这些字母也可以是非拉丁字母。 See this answer and comments。因此,要匹配一封信,请使用[\u00C0-\u1FFF\u2C00-\uD7FF\w]

  2. 如果你想在Javascript中这样做,正则表达式是有限的。无法使用单词边界\b,因为它与指定的字母范围不匹配。 Lookbehind不可用。我们需要使用指定字母的negated class。像(?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w-])这样的“词边界”。在这里,我还添加了'以避免匹配,例如can't

  3. 使用lookahead检查是否在括号外:(?![^(]*\))

  4. 所有图案看起来都像

    (?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w])([\u00C0-\u1FFF\u2C00-\uD7FF\w])(?![^(]*\))
    

    See this fiddledemo at regex101