正则表达式:如何查找单词之间的破折号

4
在PCRE中如何找到单词之间的短横线
例如:
First-file-111-222.txt This-is-the-second-file-123-456.txt And-the-last-one-66-77.txt
因此,要找到“First”和“File”之间的破折号(等等)
然后我可以用空格替换它们。
通过使用“( [^a-zA-Z] \ d(.+))”,我可以选择最后一部分(破折号 + 数字),但我不知道如何标记其他破折号。
==编辑== 想法是使用改名工具(支持正则表达式) - 重命名将结果为:
First file-111-222.txt This is the second file-123-456.txt And the last one-66-77.txt
所以,在最后一个单词后面和数字之间的破折号被保留在原位。 只有在单词之间的破折号需要被替换。

我猜你在replace中漏掉了全局标志。我不确定你用的是哪种语言进行replace。例如,在sed中,我们使用以下命令:sed s/find/replace/gsed 's/-/ /g。末尾的g表示应该用' '替换所有'-'的出现次数。 - anishsane
4个回答

2
如果我没有漏掉任何东西,以下正则表达式应该适用于您:
(?<=\D)-(?=\D)

这只是意味着查找连字符,如果它位于两个非数字字符之间。

实时演示:http://www.rubular.com/r/O2XUNaB02R


1
非常感谢!这真是太神奇了!真的很棒。我自己无法弄清楚(新手)。再次感谢!! - user2243577

1
使用“look arounds”:
(?i)(?<=[a-z])-(?=[a-z])

这将匹配前面有字母,后面也有字母的连字符。

再次感谢你。实际上,就我所看到的,两者都是在做同样的事情。坦率地说,作为一个初学者,对我来说,无论哪个都是魔法,我需要同时学习它们,以了解到底发生了什么。虽然我自己没有想到这一点,但我确实花了很多时间试图弄清楚这个问题。不管怎样,再次感谢!(这是我在stackoverflow上的第一篇帖子,不确定是否可以将2个答案标记为解决方案) - user2243577
区别在于“非数字”与“字母”不同。例如,如果文件名是“abc-xyz-.txt”,并且您使用另一个正则表达式,则会得到“abc xyx .txt”,因为“.”是“非数字”,但是使用我的正则表达式,您将获得所需的“abc xyz-.txt”。如果您确信不会出现这种情况,请使用另一个正则表达式,因为它更简单。如果您想要安全,请使用我的正则表达式。不,您不能接受两个答案 :) - Bohemian

0

你只想处理破折号吗?如果是这样,下面的代码应该可以解决问题,假设你的输入在一个名为foo的文件中。

perl -pe "s/-/ /g" < foo

这将会输出:

First file 111 222.txt
This is the second file 123 456.txt
And the last one 66 77.txt

s 前缀表示正则表达式将用于替换,而末尾的 g 表示全局替换,因此解释器不应在找到第一个匹配项后停止。


0

您需要启用全局模式,它将查找并替换匹配文本中的每个出现。以下是一个示例:http://www.regex101.com/r/hG5rX8(请注意选项中的g)。

实际的正则表达式足够简单,如\w-\w即可获取破折号。


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