如何将正则表达式环视组合成逻辑组

问题描述 投票:0回答:2

我正在使用这个正则表达式模式,由正向后视和正向前视组成,来拆分以 Pascal 大小写格式设置的字符串单词:

(?<=[a-z])(?=[A-Z])

这可用于拆分,例如,“MyPascalCasedString”为 [“My”、“Pascal”、“Cased”、“String”]。

现在我想修改模式以考虑某些特殊情况:固定单词看起来像 pascal 大小写但被认为是单个单词并且不应拆分,例如“LibreOffice”。我尝试了额外的负面环视:

(?<=[a-z])(?=[A-Z])(?<!Libre)(?!Office)

有效:“ThisIsLibreOffice”被拆分为 [“This”、“Is”、“LibreOffice”]。但是,仅以“Libre”开头或以“Office”结尾的单词也不会拆分:
"ThisIsLibreSoftware" -> ["This", "Is", "LibreSoftware"]
"ThisIsAnotherOffice" -> ["This", "Is", "AnotherOffice"]

我怎样才能结合消极的环视,使它们只匹配在一起,并且仍然与两个积极的环视相结合?

regex regex-lookarounds
2个回答
2
投票

当您“或”额外环顾四周时,它会起作用:

(?<=[a-z])(?=[A-Z])((?<!Libre)|(?!Office))

https://regex101.com/r/SpeVjm/1

为了添加更多特殊情况,例如“开放项目”:

(?<=[a-z])(?=[A-Z])((?<!Libre)(?<!Open)|(?!Office)(?!Project))

https://regex101.com/r/zoM5fs/1

如您所见,它的扩展性不是很好,很快就会失控。我可能宁愿在后处理步骤中将特殊情况合并在一起。


0
投票

这是我认为可以做到的唯一方法。

(?<=[a-z])(?<!Libre(?=Office))(?=[A-Z])

https://regex101.com/r/hQ306t/1

 (?<= [a-z] )         # Behind a lower case
 (?<!                 # Here in the middle: ( but could be anywhere )
    Libre                # No 'Libre' behind, and
    (?= Office )         # No 'Office' ahead
 )
 (?= [A-Z] )          # Ahead a upper case
© www.soinside.com 2019 - 2024. All rights reserved.