正则表达式:缺少最后一个符号

RegExp: last symbol missing

我写了一个正则表达式:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.+)[^\)]$

将字符串分为街道类型和街道名称。有些街道有街道位置描述,我不想select。

这是: https://regex101.com/r/j3gF5b/2

它有效,但街道名称中的每个最后一个符号都丢失了。我想知道为什么会出现这种情况以及如何修复?

您的 [^)] 正好匹配 1 个不是 ) 的字符...那是您从街道名称中遗漏的字母

你可以使用这个:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^\)]+?)$

原因是否定字符class仍然消耗匹配的子串。在断言 string/line:

结束后使用 negative lookbehind(零宽度断言,非消耗构造)
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.+)$(?<!\))
                                                         ^^^^^^^

所有以)结尾的匹配都会失败。

regex demo

另一种方法是使用否定前瞻(如果正则表达式引擎不支持后视,如JavaScript):

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)(?!.*\)$)\s*(.+)$

another demo

将其放入捕获组中(并最终排除换行符):

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s(.*[^)\r\n])$

demo

如果您只想丢弃位置描述并保留其余部分:

^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)\s([^(\s]*(?:\h+[^(\s]+)*)

demo