我想让正则表达式仅在后面和后面的单词只有字母时才让我找到破折号(以便我将这些破折号替换为空格)。因此,例如,我不想在产品代码的中间放置一个空格(该空格可能包含一些特殊字符或数字)。
如何找到所有连字符的连字符?
no- -no 00-00 no 0-no no-0 0nono-nono0 yes-yes yes-yes-yes
x x x x x x ^ ^ ^
尝试:
\b(?<!([\d\W]))-(?!([\d\W]))\b
https://www.regextester.com/?fam=105652
谢谢!
答案 0 :(得分:1)
尝试以下模式:
\b[A-Za-z]+(?:-+[A-Za-z]+)+\b
这里是一个解释:
\b[A-Za-z]+ - match an initial word containing only letters
(?:-+[A-Za-z]+)+ - followed by 1+ some number of hyphens and another all letters word
\b - the final word also ends in a word boundary
如果您真的只需要匹配破折号,我们可以尝试使用可变宽度的环顾四周:
(?<=\b[A-Za-z]+)-(?=[A-Za-z]+\b)
但是,这甚至在上面的正则表达式演示中也不起作用,因为它不支持可变宽度的后视。
编辑:
您现在的实际问题似乎是要用空格替换这些匹配的破折号。如果是这样,请按照以下模式进行查找:
\b([A-Za-z]+)-(?=[A-Za-z]+\b)
然后替换为:
$1 <-- space after $1
答案 1 :(得分:1)
要匹配仅是破折号,您可以使用:
(?:(?<= )|\G)[a-z]+\K-(?=(?:[a-z]+-)*[a-z]+\b)
https://regex101.com/r/6lkTmn/4
这有点棘手,需要\G
(在最后一场比赛的末尾匹配位置)和\K
(“忘记”到现在为止所有匹配的内容)。从一开始就将其分解:
(?:(?<= )|\G)
-在一个空格之后匹配一个位置(一个单词的开头),或者匹配上一个匹配项的结尾(表明我们在一个中间)复合词)。 (不能使用\b
代替后面的样子,因为\b
将匹配-
和字母之间的位置)
[a-z]+
-匹配复合词中的初始字符(无数字)
\K
-这是我们避免可变长度后视的方法-它会忘记所有先前匹配的字符。
-
-破折号
(?=(?:[a-z]+-)*[a-z]+\b)
-前瞻性地查找字母字符,可能还用短划线隔开。避免匹配以有效格式开头但以无效格式结尾的复合词,例如-nono0
。