【问题标题】:perl regex for allchars in between (ex: start*end)介于两者之间的所有字符的 perl 正则表达式(例如:开始 * 结束)
【发布时间】:2014-02-12 00:09:16
【问题描述】:

我需要像这样过滤字符串:

abc-somerandomchars-1.xml
xyz-somerandomstuff-1.xml 

我想过滤具有已知开始字符串(例如:abc、xyz)和结束字符串(例如:xml)的字符串,我不关心开始和结束字符串之间的字符

我尝试了 /($start).*.($end)/ 之类的方法,但似乎没有按预期工作。 请建议。

【问题讨论】:

  • 显示一个没有按预期工作的明确示例?

标签: regex perl


【解决方案1】:

试试下面的表达式:

/^(abc|xyz).*\.xml$/

【讨论】:

    【解决方案2】:

    $ cat test 
    xyz-somerandomchars-1.xml
    abc-somerandomchars-1.xml
    
    $ perl -p -e 's/^(abc|xyz)(.*)\.xml$/$2/g' test 
    -somerandomchars-1
    -somerandomchars-1 
    

    更新:(阅读@Vijay 的评论后)

    $ cat test 
    xyz-somerandomchars-1.xml
    abc-somerandomchars-1.xml
    qwerxyz-somerandomchars-1.xml
    abc-somerandomchars-1.xml.dwdwd
    
    $ perl -n -e 'print if /^(abc|xyz)(.*)\.xml$/' test 
    xyz-somerandomchars-1.xml
    abc-somerandomchars-1.xml
    

    【讨论】:

    • OP 只想过滤字符串而不是替换整个字符串。
    • @Vijay,定义filter是什么意思。
    • 他的意思是文件中有很多其他字符串,他只想查看那些具有该模式的字符串。
    【解决方案3】:

    如果你想匹配字符串的开头和结尾,而不是中间的某个地方,你需要锚点:\A 匹配字符串的开头,\z 匹配结尾。如果您的 $start 和 $end 可能包含特殊字符但您希望它们按字面意思匹配,请使用 \ 转义特殊字符(\Q...\E 为您执行此操作)。所以:

    /\A\Q$start\E.*\Q$end\E\z/
    

    【讨论】:

      【解决方案4】:

      以上所有答案都是正确的,但不会一概而论。这是一种更智能的方法

      /^[a-z]+-.*\.xml$/  
      

      这将捕获任何固定的开头字母模式。如果需要,您还可以包含数字。

      【讨论】:

      • 您可以通过将其替换为 .* 来达到最大智能并使其完全通用
      【解决方案5】:

      你可以使用:

      ((?:abc|xyz).*\.xml)
      

      DEMO

      说明:

      【讨论】:

      • 谢谢你,成功了。再次感谢您分享正则表达式网站,它非常方便(立即加入书签!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2023-01-03
      • 1970-01-01
      • 2014-09-15
      相关资源
      最近更新 更多