我一直在努力做到这一点。我可以匹配每个单词的第一个字母,但我不能排除大括号中的单词。
例如:
我不能(做)这个,请(帮助)我。
所以这应该匹配 - I
,c
,t
,p
,m
- 仅限。
使用\b\w
只匹配单词的第一个字母,它不会排除大括号中的单词。我也尝试过负面的预测,但似乎我不能正确地做到这一点:
(?!\(()\))\b\w
我也遇到了unicodes的问题。使用(?:^| )[a-z]{1}
或\b\w
仅匹配拉丁字母,我有时会使用不同的unicodes,例如:
我是(某人)ვიღაც。
在这种情况下,正则表达式只会匹配I
,a
和s
,而不是ვ
。感谢
答案 0 :(得分:1)
这只抓住了第一个字母:
(小于?= [^(])\ B \瓦特
这是一个积极的背后:(来自https://regex101.com/)
确保给定的模式匹配,从表达式中的当前位置结束。不消耗任何字符。
foobar匹配 foobaz不匹配/(小于?= FOO)酒吧/
对于非拉丁语字符,我无法帮助您
答案 1 :(得分:1)
需要考虑不同的事情。
首先,您需要定义您的字母,这些字母也可以是非拉丁字母。 See this answer and comments。因此,要匹配一封信,请使用[\u00C0-\u1FFF\u2C00-\uD7FF\w]
如果你想在Javascript中这样做,正则表达式是有限的。无法使用单词边界\b
,因为它与指定的字母范围不匹配。 Lookbehind不可用。我们需要使用指定字母的negated class。像(?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w-])
这样的“词边界”。在这里,我还添加了'
以避免匹配,例如can't
使用lookahead检查是否在括号外:(?![^(]*\))
所有图案看起来都像
(?:^|[^'\u00C0-\u1FFF\u2C00-\uD7FF\w])([\u00C0-\u1FFF\u2C00-\uD7FF\w])(?![^(]*\))