我正在使用这个正则表达式模式,由正向后视和正向前视组成,来拆分以 Pascal 大小写格式设置的字符串单词:
(?<=[a-z])(?=[A-Z])
这可用于拆分,例如,“MyPascalCasedString”为 [“My”、“Pascal”、“Cased”、“String”]。
现在我想修改模式以考虑某些特殊情况:固定单词看起来像 pascal 大小写但被认为是单个单词并且不应拆分,例如“LibreOffice”。我尝试了额外的负面环视:
(?<=[a-z])(?=[A-Z])(?<!Libre)(?!Office)
我怎样才能结合消极的环视,使它们只匹配在一起,并且仍然与两个积极的环视相结合?
当您“或”额外环顾四周时,它会起作用:
(?<=[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
如您所见,它的扩展性不是很好,很快就会失控。我可能宁愿在后处理步骤中将特殊情况合并在一起。
这是我认为可以做到的唯一方法。
(?<=[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