RegEx删除" - "但不是" - "从一个字符串

时间:2014-05-22 16:43:23

标签: regex

我想从字符串中删除“ - ”但不删除“ - ”。 例如:“01-Frozen - Madonna.mp3”变为“01Frozen - Madonna.mp3” 我将使用/ d删除所有数字,我已经看到了一些模式。 那么身体能帮助吗?

1 个答案:

答案 0 :(得分:1)

我们以你已经指定的例子为例。 01-Frozen - Madonna.mp3

模式是:<non space character><hyphen><non space character>

如果你需要一个空格,正则表达式将是\s,它将匹配一个不间断的空格。正则表达式的精彩方面是大多数匹配标志具有相反的标记,通常用相同标识符的大写字母表示。因为,在这种情况下,我们想要一个空格,我们可以使用匹配所有不是空格的字符的\S

所以模式现在看起来像是:\S-\S

如果您已经尝试过此操作,它将无法按预期工作,因为我们只需要 连接器周围没有非空格项的连字符,并且不应包含非空格 ​​- 物品本身。

像这样的案件需要一种特殊的......呃...被称为lookaheadslookbehinds的事情。通常,这会涉及一个问号和一个标识符 - ><=:!之一。这些额外的标识符确保您希望匹配得到什么样的懒惰。您可以阅读有关他们的更多信息here

在这种情况下,我们需要使用=来确保附加到它的标记 - 在我们的例子中是\S - 不会是结果的一部分。这称为positive lookahead匹配器。所以最终的正则表达式看起来像这样:

/(?=\S)-(?=\S)/

[被修改]

释义@jerry的评论:

  

好吧,如果你想让它正常工作,你需要一个lookbehind:/(?&lt; = \ S) - (?= \ S)/。虽然在这种情况下我更喜欢消极的,因为更自然地说'没有先于'和'没有后跟':/(?

选项1:

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

选项2:

/(?<!\s)-(?!\s)/