Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex在Regexpal上工作,但在Java上不工作_Java_Regex_Vb6 - Fatal编程技术网

Regex在Regexpal上工作,但在Java上不工作

Regex在Regexpal上工作,但在Java上不工作,java,regex,vb6,Java,Regex,Vb6,注意:我刚刚学习了正则表达式,所以它可能是一个蹩脚的模式 我把这个正则表达式搞乱了 Begin VB\.Label\s+([^\s]+)\s+.+\s+Caption\s+=\s*("([^"]+)")\s+.+\s+Index\s+=\s*([0-9]+) 在VB6.frm文件中匹配这些表单控件 Begin VB.Label lblError AutoSize = -1 'True Caption =

注意:我刚刚学习了正则表达式,所以它可能是一个蹩脚的模式

我把这个正则表达式搞乱了

Begin VB\.Label\s+([^\s]+)\s+.+\s+Caption\s+=\s*("([^"]+)")\s+.+\s+Index\s+=\s*([0-9]+)
在VB6.frm文件中匹配这些表单控件

         Begin VB.Label lblError 
        AutoSize        =   -1  'True
        Caption         =   "Blah blah"
        Height          =   195
        Index           =   49
        Left            =   105
        TabIndex        =   31
        Top             =   3135
        Width           =   4455
     End
当我在Regexpal上测试它时,它工作得很好

但是
matcher.find()
只查找完全垃圾字符串

Error [&About] - "&About"
这是我的转义Java匹配器

Pattern pat = Pattern.compile("Begin VB\\.Label\\s+([^\\s]+)\\s+.+\\s+Caption\\s+=\\s+(\"([^\"]+)\")\\s+.+\\s+Index\\s+=\\s+([0-9]+)");
编辑:这是实际匹配的内容:

      Begin VB.Menu mnuHelp 
     Caption         =   "&About"
     Index           =   5
  End

我的猜测是它与正则表达式中的
+
有关。尝试:

Begin VB\.标签lblError[0-9A-Za-z\'\s\=“\&]+\sIndex\s+=\s+[0-9]+


我对它进行了测试,它成功了。

我猜它与正则表达式中的
+
有关。请尝试:

Begin VB\.标签lblError[0-9A-Za-z\'\s\=“\&]+\sIndex\s+=\s+[0-9]+


我测试了它,它成功了

我建议用你的正则表达式换个方向。您试图解析输入中的特定标签,然后从该标签中提取某些值

尝试在一个主正则表达式中完成这一切是很有诱惑力的,但是这种正则表达式很难解析,而且非常不灵活

我建议分两部分进行:

  • 拉出标签内容
  • 从单个标签中拉出特定属性
  • 这将意味着如下内容:

    /* A pattern to grab the entire label -- Everything from Begin to End */
    Pattern pEntireLabel = Pattern.compile("Begin VB\.Label.*?End", Pattern.MULTILINE);
    
    /* Patterns for each specific value you want. */
    Pattern pCaption = Pattern.compile("Caption\s*=\s*(\S*)");
    /* . . . etc. for each value you want.  . . . */
    
    Matcher mEntireLabel = pEntireLabel.matcher(...);
    while (mEntireLabel.find()) {
      String label = mEntireLabel.group(0);
    
      /* Now find the specific parameters inside the label */
      Matcher mCaption = pCaption.matcher(label);
      if (mCaption.find()) {
           caption = mCaption.group(1);
      }
    
      /* Reapply this same logic for each property you want. */
    
    }
    

    这里的优点是适应性更强——如果需要获取新参数,只需添加即可。如果你不再需要它,你就把它拿出来。如果标签中的格式可能缺少某个值的一部分,那么您将无法获得该参数,但将获得其余参数,而不是整个正则表达式失败。等等等等。

    我建议用你的正则表达式换个方向。您试图解析输入中的特定标签,然后从该标签中提取某些值

    尝试在一个主正则表达式中完成这一切是很有诱惑力的,但是这种正则表达式很难解析,而且非常不灵活

    我建议分两部分进行:

  • 拉出标签内容
  • 从单个标签中拉出特定属性
  • 这将意味着如下内容:

    /* A pattern to grab the entire label -- Everything from Begin to End */
    Pattern pEntireLabel = Pattern.compile("Begin VB\.Label.*?End", Pattern.MULTILINE);
    
    /* Patterns for each specific value you want. */
    Pattern pCaption = Pattern.compile("Caption\s*=\s*(\S*)");
    /* . . . etc. for each value you want.  . . . */
    
    Matcher mEntireLabel = pEntireLabel.matcher(...);
    while (mEntireLabel.find()) {
      String label = mEntireLabel.group(0);
    
      /* Now find the specific parameters inside the label */
      Matcher mCaption = pCaption.matcher(label);
      if (mCaption.find()) {
           caption = mCaption.group(1);
      }
    
      /* Reapply this same logic for each property you want. */
    
    }
    

    这里的优点是适应性更强——如果需要获取新参数,只需添加即可。如果你不再需要它,你就把它拿出来。如果标签中的格式可能缺少某个值的一部分,那么您将无法获得该参数,但将获得其余参数,而不是整个正则表达式失败。等等,等等。

    我做了很多关于regexpal和java的事情。。。对我来说,99%的我错过了一个转义角色!你能发布实际匹配的字符串吗?这可能会提供一些线索…我已经编辑了这篇文章。菜单被钩住而不是标签。这很奇怪。我做了很多你用正则表达式和java做的事情。。。对我来说,99%的我错过了一个转义角色!你能发布实际匹配的字符串吗?这可能会提供一些线索…我已经编辑了这篇文章。菜单被钩住而不是标签。很奇怪,效果很好!我稍微修改了它,所以得到了Caption和Index属性<代码>开始VB\.Label lblError[0-9A-Za-z-'\s=“&]+\sCaption\s+=\s+”([^“]+)“[0-9A-Za-z-'\s=“&]+\sIndex\s+=\s+([0-9]+)工作得很好!我稍微修改了它,所以我得到了标题和索引属性。
    开始VB\.Label lblError[0-9A-Za-z-'\s=“&]++\sCaption\s+”([0-9A-Za+]
    这解决了我在尝试分解正则表达式时遇到的另一个问题—查找仅与该标签对应的模式。在整体匹配中进行匹配是一种很好的方法,谢谢。这解决了我在尝试分解正则表达式时遇到的另一个问题——找到只与该标签对应的模式。整体匹配中的匹配是一个很好的方法,谢谢。