正则表达式查找破折号的实例,但不是<space> dash <space>的实例

时间:2018-12-01 09:56:30

标签: regex notepad++

我太亲密了。我正在尝试为Notepad ++编写正则表达式表达式,以用空格替换破折号,已经使用前置/后置空格忽略破折号。我知道我可以用“ foobarfoo”搜索/替换“-”,然后搜索“-”替换“”,然后将“ foobarfoo”转换回“-”,但是该死的-我正在尝试学习正则表达式!

这是我的问题:

  

适配器-BNC公头到BNC公头,直角

  

适配器-BNC公头至BNC母头,直角

(请注意“ BNC女性”中消失的破折号)

我最近得到的就是这样的: /(?:[^( )])\-(?:[^( )])/g

但是结果是找到前面的单个字母,破折号和后面的单个字母:

  

适配器-BNC公头到BN C-F 公头,直角

为什么选择前/后字符?这不是吗?

(?:[^( )])找到一个空格以外的任何东西(作为一个非捕获组)...

\- ...后跟破折号...

(?:[^( )]) ...后面紧跟一个空格(作为非捕获组)

更进一步的是,我将第一项替换为(?=[^( )]),但是如果我将第三项更改为(?![^( )]),我又回到了开始的地方-只需在两个空格之间选择短划线即可。 GRRRR。

更多示例,请访问http://regexr.com/444i2

3 个答案:

答案 0 :(得分:5)

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

在替换中使用空格。

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

Regex demo

答案 1 :(得分:1)

使用\w(-)\w替换由字母,数字和下划线包围的所有连字符,或使用[^ ](-)[^ ]替换由非空格字符包围的所有连字符。

在我的Notepad ++版本中,所有示例都可以正常工作。

答案 2 :(得分:1)

Notepad ++最易读的选项是基于交替的正则表达式,带有条件替换模式:

查找内容(\s-\s)|-
替换为(?1$1: )

(\s-\s)|-模式将空白-和一个空白捕获到组1中,或者仅匹配-。如果第1组匹配,则将其值粘贴回原来的位置(=跳过此匹配),否则在其他上下文中的-将替换为空格。

请参见下面的演示: enter image description here

另一个选择是使用嵌套的环顾四周:

查找内容-(?<!\s-(?!=\s))
替换为 (空格)

模式匹配:

  • --连字符
  • (?<!\s-(?!=\s))-如果它的模式紧跟当前位置左侧(即,-之后)的以下模式与以下模式匹配,则此否定式查找将使匹配失败:
    • \s-空格
    • --连字符(确保我们到达触发了向后搜索的位置相同的位置这是必需的)
    • (?!=\s)-下一个字符是空格(这是一个前瞻,无法将其设为简单的\s,因为我们不能让后视移动其模式位置匹配,即可以不要让它在\s-\s之前和之前尝试-(这会导致 true 结果)。

enter image description here