查找未被字符包围的连字符的正则表达式。

3
我需要帮助构建一个正则表达式,以查找前后字符不是a-z和A-Z的所有连字符。以下是应该找到连字符的示例。
This is - test
this is -test
this is- test
this is 2- test
this is 2 -test
this is 2-2 test

以下是一个忽略连字符的示例:
this is-test

迄今为止,我能够编写以下内容:
(?<=[^a-z])-(?=[^a-z])

这只搜索行中以下划线:

This is - test
this is 2- test
this is 2-2 test

非常感谢。

你只需要 (?<=[^a-zA-Z])-(?=[^a-zA-Z]) 吗?如果连字符是第一个或最后一个字符怎么办?你是指“和”还是“或”? - NetMage
你需要编写以下两种格式之一: "...在字符前后都不是连字符..." 或者 "...在字符前后都不是连字符,字符串开头有一个连字符且后面跟着一个非连字符,字符串结尾有一个非连字符且前面跟着一个连字符。" - Cary Swoveland
1个回答

4
首先,与其在正向先行断言/回顾后面使用否定类,你可以使用负向先行断言/回顾代替(除非你想确保连字符前后都有内容)。现在,你的模式意味着:
匹配一个连字符,它不是由[a-z]前缀没有[a-z]后缀跟随。
而你似乎要查找的是:
同时不以[a-z]前缀[a-z]后缀跟随的连字符。
这种情况下,你可以使用以下内容:
(?<![a-z])-|-(?![a-z])

Demo

或者,如果你想保留带否定类的正向先行断言:

(?<=[^a-z])-|-(?=[^a-z])
注意:你提到你想检查 a-zA-Z,但在你的示例中,你只使用了 a-z。要同时检查两者,可以在上面的模式中将 [a-z] 替换为 [a-zA-Z]

我不确定我会把“and”解释为“or”。还有别忘了“A-Z”。 - NetMage
@NetMage 我添加了一个解释。这有点棘手,因为在两种情况下都可以是“and”(或者根据你如何构造句子可能是“or”)。然而,OP提供的示例表明他们正在寻找第二个选项。 - 41686d6564 stands w. Palestine
我明白你的意思。但我仍然认为你需要“从A到Z”。 - NetMage
2
不行。原帖的模式要求连字符前后必须有非连字符字符,这对于字符串开头或结尾处的连字符有影响。 - Cary Swoveland
1
@NetMage OP在他们的模式中使用了"a-z",但你是对的。已添加注释。 - 41686d6564 stands w. Palestine
@CarySwoveland 你说得对。这可能是原帖作者的意图。 - 41686d6564 stands w. Palestine

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