为了账号安全,请及时绑定邮箱和手机立即绑定

要匹配的正则表达式模式,不包括...... /除外

要匹配的正则表达式模式,不包括...... /除外

胡子哥哥 2019-05-28 16:06:01
要匹配的正则表达式模式,不包括...... /除外 目前的答案有一些有用的想法,但我想要更完整的东西,我可以100%理解和重用; 这就是我设置赏金的原因。对于我来说,无处不在的想法比没有标准语法更好\K这个问题是关于如何匹配模式除了某些情况s1 s2 s3。我举一个具体的例子来说明我的意思,但更喜欢我能100%理解的一般答案,所以我可以在其他情况下重复使用它。例我希望匹配五位数\b\d{5}\b但不能在三种情况下匹配s1 s2 s3:s1:不在以句子这样的句号结尾的行上。s2:在parens里面没有任何地方。s3:不在以#开头if(和结尾的块内//endif我知道如何使用前瞻和后视来解决s1 s2 s3中的任何一个,特别是在C#lookbehind或\KPHP中。例如S1 (?m)(?!\d+.*?\.$)\d+s3与C#lookbehind (?<!if\(\D*(?=\d+.*?//endif))\b\d+\bs3与PHP \ K (?:(?:if\(.*?//endif)\D*)*\K\d+但条件的混合使我的头脑爆炸。更糟糕的是,我可能需要在其他时间添加其他条件s4 s5。好消息是,我不在乎是否使用PHP,C#,Python或邻居的洗衣机等常用语言处理文件。:)我几乎是Python和Java的初学者,但有兴趣了解它是否有解决方案。所以我来到这里看是否有人想到一个灵活的食谱。提示没问题:你不需要给我完整的代码。:)谢谢。
查看完整描述

3 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

进行三种不同的匹配,并使用程序中条件逻辑处理三种情况的组合。你不需要处理一个巨大的正则表达式中的所有东西。

编辑:让我扩大一点,因为问题变得更有趣:-)

您在此尝试捕获的一般想法是匹配某个正则表达式模式,但不是当测试字符串中存在某些其他(可能是任何数字)模式时。幸运的是,您可以利用您的编程语言:保持正则表达式简单,只需使用复合条件。最好的做法是在可重用的组件中捕获这个想法,所以让我们创建一个实现它的类和方法:

using System.Collections.Generic;using System.Linq;using System.Text.RegularExpressions;public class MatcherWithExceptions {
  private string m_searchStr;
  private Regex m_searchRegex;
  private IEnumerable<Regex> m_exceptionRegexes;

  public string SearchString {
    get { return m_searchStr; }
    set {
      m_searchStr = value;
      m_searchRegex = new Regex(value);
    }
  }

  public string[] ExceptionStrings {
    set { m_exceptionRegexes = from es in value select new Regex(es); }
  }

  public bool IsMatch(string testStr) {
    return (
      m_searchRegex.IsMatch(testStr)
      && !m_exceptionRegexes.Any(er => er.IsMatch(testStr))
    );
  }}public class App {
  public static void Main() {
    var mwe = new MatcherWithExceptions();

    // Set up the matcher object.
    mwe.SearchString = @"\b\d{5}\b";
    mwe.ExceptionStrings = new string[] {
      @"\.$"
    , @"\(.*" + mwe.SearchString + @".*\)"
    , @"if\(.*" + mwe.SearchString + @".*//endif"
    };

    var testStrs = new string[] {
      "1." // False
    , "11111." // False
    , "(11111)" // False
    , "if(11111//endif" // False
    , "if(11111" // True
    , "11111" // True
    };

    // Perform the tests.
    foreach (var ts in testStrs) {
      System.Console.WriteLine(mwe.IsMatch(ts));
    }
  }}

所以上面,我们设置了搜索字符串(五位数),多个异常字符串(你的s1s2s3),然后尝试匹配几个测试字符串。打印结果应如每个测试字符串旁边的注释中所示。


查看完整回答
反对 回复 2019-05-28
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

你的要求是,在所有情况下都不可能满足于parens。也就是说,如果你能以某种方式找到(左边和)右边的,它并不总是意味着你在内部。例如。

(....) + 55555 + (.....)-不,在括号内部竟然有()左,右

现在你可能会认为自己很聪明,(只有你)以前没有遇到过左边,反之亦然。这不适用于这种情况:

((.....) + 55555 + (.....))- 即使有关闭)(左边和右边,也在内部。

不可能发现你是否在使用正则表达式的parens中,因为正则表达式无法计算已经打开了多少个parens以及关闭了多少个parens。

考虑这个更简单的任务:使用正则表达式,找出字符串中的所有(可能是嵌套的)parens是否已关闭,这是(您需要查找的每一个)。你会发现它是不可能解决的,如果你用正则表达式无法解决这个问题,那么你无法弄清楚一个单词是否在所有情况下都在parens中,因为你无法弄清楚字符串中的某个位置所有前面(都有相应的)


查看完整回答
反对 回复 2019-05-28
  • 3 回答
  • 0 关注
  • 1417 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信