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+]
这解决了我在尝试分解正则表达式时遇到的另一个问题—查找仅与该标签对应的模式。在整体匹配中进行匹配是一种很好的方法,谢谢。这解决了我在尝试分解正则表达式时遇到的另一个问题——找到只与该标签对应的模式。整体匹配中的匹配是一个很好的方法,谢谢。