我写了一个正则表达式:
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)s(.+)[^)]$
将字符串分为街道类型和街道名称。有些街道有街道位置描述,我不想选择。
这里是:https://regex101.com/r/j3gf5b/2
它有效,但是街道名称中的每个最后一个符号都缺少。我想知道为什么会发生这种情况以及如何修复?
您的[^)]
完全匹配1个不是)
的字符...那是您街头名称中缺少的字母
您可以使用以下方式:
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)s([^)]+?)$
原因是否定的字符类 stall 消耗匹配的子字符串。在断言字符串/行的末尾之后,请使用否定的lookbehind (零宽的断言,非消费构建体):
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)s(.+)$(?<!))
^^^^^^^
它将失败与)
结束的所有匹配。
请参阅Regex Demo
另一种方法是使用负面的lookahead(如果正则发动机不支持lookhinds,如javaScript中):
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)(?!.*)$)s*(.+)$
请参阅另一个演示
将其放在捕获组中(最终也排除了newline字符):
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)s(.*[^)rn])$
演示
如果您只想丢弃位置描述并保留其余的:
^(проезд|пл|пр-кт|пер|наб|линия|км|б-р|аллея|кв-л)s([^(s]*(?:h+[^(s]+)*)
demo