【问题标题】:Regex permits forbidden strings - can anyone advise?正则表达式允许禁止的字符串 - 任何人都可以建议吗?
【发布时间】:2013-11-25 22:00:27
【问题描述】:

我想测试一个字符串是否完全匹配多个模式之一。

我想我可以用

myRegex.IsMatch(testString) && myregex.Match.ToString()==testString 

但这可以在正则表达式模式本身中完成吗?

我想测试 testString 是否完全匹配 DOCEMAIL,或 HTML::sometexthereCSV::sometexthere。 例如,它不能与DOC::sometexthere 匹配 - 那应该是“失败”

我当前的正则表达式模式是^(DOC|EMAIL)|((CSV|HTML)::.+),但它允许使用禁止的字符串,例如DOC::sometexthere

TIA

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    以下正则表达式应该完全符合您的要求:((DOC|EMAIL)|((HTML|CSV)::.*))

    在以下字符串上进行了测试:

    • DOC - 匹配
    • EMAIL - 匹配
    • EMAIL::someTextHere - 不匹配
    • DOC::someTextHere - 不匹配
    • HTML::SomeTextHere - 匹配
    • CSV::someTextHere - 匹配

    更新 把它改成这个,它应该完全满足你的需求。

    ((DOC|EMAIL)$|((HTML|CSV)::.+))
    

    添加了 $ 这样它就不会在 DOC::sometext 中捕获 DOC 将 * 更改为 + 所以它应该至少在 :: 后面包含一个字符

    【讨论】:

    • 我需要使用“+”而不是“*”::: 之后必须有一些东西,否则它也是无效的。
    • 确实可以将 * 替换为 +。 (将其从 0 个或更多更改为 1 个或更多匹配)
    【解决方案2】:

    您的模式是正确的,但您必须添加一个“字符串结尾”锚$

     ^((DOC|EMAIL)|((CSV|HTML)::.+))$
    

    请注意,我已将两种可能性括在括号内。

    【讨论】:

    • 谢谢 - 我已经尝试过 $ 的想法,但成功的是额外的一对括号。
    • @NeilHaughton:是的,如果你省略这个,结束锚点只用于模式的第二部分。
    • 我猜 ^(somethinghere)$ 的意思是“以相同的东西开始和结束”,实际上意味着完全匹配,但它也可以匹配“DOCDOC”,例如?
    • @NeilHaughton:不,它没有。 ^ 表示“字符串的开头”,$ 表示“字符串的结尾”,仅此而已。
    • 那么为什么外面的括号会有所不同呢?这是否意味着“必须以括号中的所有内容开头,并且必须以括号中的所有内容结尾”?我试图理解为什么这不是模棱两可,允许 DOCDOC 而不仅仅是 DOC(例如)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2013-09-18
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多