【问题标题】:metacharacters in regular expressions正则表达式中的元字符
【发布时间】:2012-09-23 23:13:00
【问题描述】:

全部

如果我想从 .txt 文件中读取一个字符并将搜索边界(仅一个字符。空格)设置为读取“一个数字 2 到 9 或除 e 之外的一个小写字符”,其中一个会是以下两个正则表达式是正确的方法吗?

I. "[/w[2-9][a-z&&[^e]]]"  

对比

II. "[[2-9][a-z&&[^e]]]"

我倾向于第二个,但我在 java.util.regex.Pattern 描述中找不到任何内容,该描述显示了如何同时搜索同一位置的数字和字符。任何帮助都会很棒。谢谢! ^^

【问题讨论】:

    标签: java regex string parsing text


    【解决方案1】:

    您的第二个正则表达式是正确的,但您不需要所有这些括号。这样就可以了:

    "[2-9a-z&&[^e]]"
    

    这将比@ruakh 的建议(?!e)[2-9a-z] 更有效,后者必须在每个位置执行两次测试。这正是 Java 开发人员试图用交集运算符&& 解决的问题。 Unicode 联盟与其他set operations 一起支持了这个想法。

    我不知道您使用第一个正则表达式的目的是什么,但 /w 都将被视为文字字符,使其等同于 [2-9a-df-z/],这听起来不像你想要的。


    编辑:但不要误会我的意思,效率并不是喜欢这种方法的唯一原因。它甚至不是最重要的。 Premature optimization 在正则表达式中和其他任何地方一样邪恶。集中精力使您的正则表达式尽可能简单明了,您不必担心性能。我的正则表达式比前瞻版本更简单(因为它只执行一种 操作)和更清晰(更易读)(但不是很多;&& 语法对我来说仍然看起来很可怕) .

    【讨论】:

    • 太好了,谢谢你的提示!在你提到它之前,我什至没有考虑效率......干杯! ^^
    • 很好,感谢您的链接;内容丰富且乐于助人!
    【解决方案2】:

    你会写:

    [2-9a-df-z]
    

    如果你真的想用明确的“不是e”来写a-z,你可以写:

    (?!e)[2-9a-z]
    

    但我认为这有点过头了。

    【讨论】:

      【解决方案3】:

      试试[2-9a-df-z]。这将匹配从29 的数字,以及除e 之外的所有小写字符,即从ad,以及从fz

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 2017-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多