【问题标题】:Regular Expression sub-expressions正则表达式子表达式
【发布时间】:2009-06-10 15:48:21
【问题描述】:

我正在研究一个需要标记子表达式的正则表达式(在 .Net 中)。示例输入是:

  1. EFBCFEyy
    • EFBQFEyyQ
    • EFBQFE 年年问
    • EFBMFEyyMM
    • EFByyMFEMM

我需要的是提取所有由“yy”或“MM”描述的子表达式。到目前为止,我得到的表达式适用于前几个字符串,但不适用于最后一对。可能会有空格,它们与周围的非日期格式字符组合在一起。

用“/”分隔子表达式,这就是我(分别)寻找的,粗体部分是我需要在 RegEx 评估后操作的部分:

  1. EFBCFE/年
    • EFBQFE/yy/Q
    • EFBQFE /yy/ Q
    • EFBMFE/yy/MM
    • EFB/yy/MFE/MM

这是我对前三个有效的:

(.*)(yy|MM)(.*)

我错过了什么?

【问题讨论】:

    标签: .net regex .net-2.0


    【解决方案1】:

    在 Java 中,这可以满足您的需求:

    MyString.split('yy|MM')
    

    如果 .NET 没有类似的正则表达式拆分功能,我会感到惊讶...

    我们开始吧,这看起来是 .NET 的等价物: http://msdn.microsoft.com/en-us/library/8yttk7sy.aspx

    Regex.Split( MyString , 'yy|MM' )
    

    【讨论】:

    • 太完美了,我不知道我怎么没有注意到这一点。谢谢!
    • +1 唯一的问题是:你不知道你后来分裂了什么。你有碎片,但你不知道它们之间有哪些“分隔符”。
    • 没错,如果需要知道使用了哪些分隔符,则需要更复杂的逻辑。
    【解决方案2】:

    “我需要的是拉出所有由“yy”或“MM”描绘的子表达式。”

    yy|MM
    

    这就是你所需要的(除非我对这个问题有误解)。

    申请为“全球”。对我来说,它与粗体部分相匹配:

    • EFBCFE年年
    • EFBQFEyyQ
    • EFBQFE 年年
    • EFBMFEyyMM
    • EFByyMFEMM

    【讨论】:

    • “申请为‘全球’”是什么意思?
    • 每个正则表达式引擎中都有一个所谓的“全局”标志。它在整个字符串上重复应用该模式,以便您找到的不仅仅是第一个匹配项。
    • 看看gskinner.com/RegExr 并玩一会儿。你会明白我的意思。
    • 我需要相反的,我需要不是粗体的部分。
    • 哦,我明白了。用正则表达式做与匹配某事相反的事情是困难的。我宁愿选择“yy”和“MM”,找出它们的位置,然后根据这些信息剖析字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多