0

注意:我刚学过正则表达式,所以它可能是一个糟糕的模式

我破解了这个正则表达式

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
4

2 回答 2

2

我的猜测是它与.+您的 RegEx 中的有关。尝试:

Begin VB\.Label lblError[0-9A-Za-z\-\'\s\=\"\&]+\sIndex\s+=\s+[0-9]+

我测试了它并且它有效。在这里演示

于 2012-05-15T16:55:21.000 回答
1

我建议您使用正则表达式朝不同的方向发展。您正在尝试解析输入中的特定标签,然后从该标签中提取某些值。

尝试在一个主正则表达式中完成所有操作很诱人,但这类正则表达式可能难以解析且非常不灵活。

我建议分两部分进行:

  1. 拉出标签内容。
  2. 从单个标签中拉出特定属性。

这将意味着类似以下内容:

/* 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. */

}

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

于 2012-05-15T17:25:21.567 回答