【问题标题】:Regular Expressions: How to find dashes between words正则表达式:如何在单词之间找到破折号
【发布时间】:2013-06-02 07:04:02
【问题描述】:

在 PCRE 中如何找到单词之间的破折号

例如

第一个文件-111-222.txt
这是第二个文件-123-456.txt
And-the-last-one-66-77.txt

所以,First 和和 File 之间的破折号(等)

然后我可以用空格替换它们。

使用([^a-zA-Z]\d(.+)) 我可以选择最后一部分(破折号+nbrs),但我不知道如何标记其他破折号。

== 编辑 这个想法是使用重命名工具(支持正则表达式) - 然后重命名会导致

第一个文件-111-222.txt
这是第二个文件-123-456.txt
还有最后一个-66-77.txt

所以,- 在最后一个单词之后和数字之间要保持原位。 只替换单词之间的那些。

【问题讨论】:

  • 我猜,你错过了替换中的全局标志。我不确定您使用哪种语言进行替换。例如在 sed 中,我们按如下方式使用它:sed s/find/replace/gsed 's/-/ /g。末尾的g 表示所有出现的'-' 都应替换为' '

标签: regex pcre


【解决方案1】:

使用环视:

(?i)(?<=[a-z])-(?=[a-z])

这匹配前面有一个字母和后面有一个字母的破折号。

【讨论】:

  • 再次感谢您。实际上,据我所知,两者都在做同样的事情。坦率地说,作为一个初学者,对我来说,任何一个都是魔术,我需要研究它们以了解实际发生的情况。我自己不会想到这一点,尽管我确实花了很多时间试图自己弄清楚这一点。无论如何,再次感谢! (这是我在stackoverflow上的第一篇文章,不确定我是否可以标记2个答案作为解决方案)
  • 区别在于“非数字”与“字母”不同。例如,如果文件名是"abc-xyz-.txt",而你使用了另一个正则表达式,你会得到"abc xyx .txt",因为. 是一个“非数字”,但使用我的正则表达式你会得到"abc xyz-.txt"。如果您确信不会出现此类情况,请使用其他正则表达式,因为它更简单。如果您想安全,请使用我的。不,你不能接受两个答案:)
【解决方案2】:

如果我没有遗漏任何遵循正则表达式的内容应该对你有用:

(?<=\D)-(?=\D)

这只是意味着如果它在 2 个非数字字符之间,则找到一个连字符。

现场演示:http://www.rubular.com/r/O2XUNaB02R

【讨论】:

  • 非常感谢!这太神奇了!真的很棒。我自己(新手)无法弄清楚这一点。再次,非常感谢!
【解决方案3】:

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

正如实际的正则表达式一样,\w-\w 这样简单的东西就足以获得破折号。

【讨论】:

    【解决方案4】:

    您想要处理的只是破折号吗?如果是这样,下面的代码应该可以解决问题,假设您在一个名为 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 表示它是全局替换,因此解释器在找到第一个匹配项后不应停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2015-05-19
      相关资源
      最近更新 更多