我太亲密了。我正在尝试为Notepad ++编写正则表达式表达式,以用空格替换破折号,已经使用前置/后置空格忽略破折号。我知道我可以用“ foobarfoo”搜索/替换“-”,然后搜索“-”替换“”,然后将“ foobarfoo”转换回“-”,但是该死的-我正在尝试学习正则表达式!
这是我的问题:
适配器-BNC公头到BNC公头,直角
到
适配器-BNC公头至BNC母头,直角
(请注意“ BNC女性”中消失的破折号)
我最近得到的就是这样的:
/(?:[^( )])\-(?:[^( )])/g
但是结果是找到前面的单个字母,破折号和后面的单个字母:
适配器-BNC公头到BN C-F 公头,直角
为什么选择前/后字符?这不是吗?
(?:[^( )])
找到一个空格以外的任何东西(作为一个非捕获组)...
\-
...后跟破折号...
(?:[^( )])
...后面紧跟一个空格(作为非捕获组)
更进一步的是,我将第一项替换为(?=[^( )])
,但是如果我将第三项更改为(?![^( )])
,我又回到了开始的地方-只需在两个空格之间选择短划线即可。 GRRRR。
更多示例,请访问http://regexr.com/444i2
答案 0 :(得分:5)
答案 1 :(得分:1)
使用\w(-)\w
替换由字母,数字和下划线包围的所有连字符,或使用[^ ](-)[^ ]
替换由非空格字符包围的所有连字符。
在我的Notepad ++版本中,所有示例都可以正常工作。
答案 2 :(得分:1)
Notepad ++最易读的选项是基于交替的正则表达式,带有条件替换模式:
查找内容:(\s-\s)|-
替换为:(?1$1: )
(\s-\s)|-
模式将空白-
和一个空白捕获到组1中,或者仅匹配-
。如果第1组匹配,则将其值粘贴回原来的位置(=跳过此匹配),否则在其他上下文中的-
将替换为空格。
另一个选择是使用嵌套的环顾四周:
查找内容:-(?<!\s-(?!=\s))
替换为:
(空格)
模式匹配:
-
-连字符(?<!\s-(?!=\s))
-如果它的模式紧跟当前位置左侧(即,-
之后)的以下模式与以下模式匹配,则此否定式查找将使匹配失败:
\s
-空格-
-连字符(确保我们到达触发了向后搜索的位置相同的位置这是必需的)(?!=\s)
-下一个字符是空格(这是一个前瞻,无法将其设为简单的\s
,因为我们不能让后视移动其模式位置匹配,即可以不要让它在\s-\s
之前和之前尝试-
(这会导致 true 结果)。