正则表达式查找破折号,但不包括<空格>破折号<空格>

6
我非常接近了。我正在尝试编写一个正则表达式,用于在Notepad++中将破折号替换为空格,并“忽略”已经具有前/后空格的破折号。我意识到我可以使用“ - ”替换为“ foobarfoo”,然后搜索“-”,用“ ”替换,然后将“ foobarfoo”转换回“ - ”,但该死的——我正在尝试学习正则表达式!
这是我的问题:
适配器-BNC男头到BNC女头,直角
to
适配器-BNC男头到BNC女头,直角
(注意“BNC Female”中消失的破折号)
我最接近的方法是使用: /(?:[^( )])\-(?:[^( )])/g
但结果会找到前面的单个字母、破折号和后面的单个字母:
适配器-BNC男头到BNC-Female,直角
为什么它选择前/后字符?这不是:
(?:[^( )]) 找到除空格之外的任何内容(作为非捕获组)...

\- ... 后面跟着一个破折号 ...

(?:[^( )]) ... 并且后面跟着任何不是空格的内容(作为非捕获组)

如果我用(?=[^( )]) 替换第一个术语,我会更接近,但如果我将第三个术语更改为(?![^( )]),我又回到了起点 - 只选择两个空格之间的破折号。 GRRRR.

更多样例在这里 http://regexr.com/444i2


你尝试过使用单词边界吗: \ b- \ b - bobble bubble
你的问题假设你只想避免匹配 <space>-<space>,但看起来你还想避免 <space>--<space>,是这样吗? - Wiktor Stribiżew
3个回答

11

要忽略已经有前/后空格的破折号,您可以使用正向预查来断言左右两边都是非空格字符\S

在替换中使用一个空格。

(?<=\S)-(?=\S)

Regex 演示


1
啊...空格标志。谢谢你的教育。管用! - user10731127

2
Notepad++最易读的选项是基于条件替换模式的交替正则表达式: 查找:(\s-\s)|- 替换为:(?1$1: ) (\s-\s)|-模式捕获一个空格、-和一个空格,或者只匹配-。如果第一组匹配,则将其值粘贴回原处(即跳过此匹配),否则在其他上下文中用空格替换-
以下是演示: enter image description here 另一个选择是使用嵌套的前后查找: 查找:-(?<!\s-(?!=\s)) 替换为: (一个空格)
该模式匹配:
- - - 一个连字符 - (?<!\s-(?!=\s)) - 如果其模式立即匹配当前位置左侧的以下模式(即紧挨着-之后),则此负向后查找失败:
- \s - 一个空格 - - - 一个连字符(这是必要的,以确保我们到达触发后面查找的同一位置) - (?!=\s) - 下一个字符是空格(这是一个前瞻,不能将其设置为简单的\s,因为我们不能让后向查找移动其模式位置匹配,即我们不能让其尝试\s-\s直到包括-(这将导致结果)。
以下是演示: enter image description here

1
请使用\w(-)\w来替换所有被字母、数字和下划线包围的连字符,或者使用[^ ](-)[^ ]来替换所有被非空格字符包围的连字符。在我的Notepad++版本中,这两种方法都可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接