Java正则表达式 - 匹配正则表达式的任何部分

时间:2014-02-18 03:54:16

标签: java regex string loops split

考虑一个模糊的正则表达式,例如[a-z]{0,9}f[a-z]{0,2}。它将匹配abcdefgh等字符串。我在这个正则表达式中添加了额外的元素,我希望它能够测试正则表达式的几个不同部分。

对于[a-z]{0,3}f[a-z]{2}e[a-z]{0,5},它将匹配face。但我希望它还可以测试字符串以匹配[a-z]{0,3}ff[a-z]{2}e[a-z]{0,3}f[a-z]{2}ef[a-z]{2}e[a-z]{0,5},但不会弄乱e[a-z]{0,5}f等顺序。更简单地说:我有一个主正则表达式,我想尝试测试不同的字符串。但我不仅要测试整个正则表达式,而且我还要测试它的每个部分,以查看字符串是否适合内部。

我不能简单地手动输入所有不同的正则表达式的可能性,因为它们是从其他执行的方法生成的,每次都会有所不同,但总是遵循上面相同的一般格式:从0到0的字母范围一些有限数字,一个或多个字母,一个特定数量的字母可以填补“差距”,另一个字母范围除了这个时间它是特定的,等等。

我花了几个小时思考并尝试不同的代码来尝试拆分正则表达式并测试每个拆分,然后将一些拆分合并在一起以尝试创建每种可能性。最终我屈服于挑战并决定寻求帮助。很难描述我想要完成的任务,所以我希望我的工作做得还不错。请耐心等待。

2 个答案:

答案 0 :(得分:0)

我认为没有任何内置方法可以做到这一点。您必须逐个匹配完整的正则表达式。假设你的正则表达式只包含以下内容:

  1. 单个字母(例如ae)。叫这个S.
  2. 字母范围(例如[a-z][p-r])。叫这个A.
  3. 固定出现次数(例如{2}{3})。叫这个F.
  4. 出现次数的范围(例如,{2,4}{0,3})。叫这个R。
  5. 您可以将正则表达式拆分为上述标记,并扫描每个子正则表达式以进行匹配。例如,[a-z]{0,9}f[a-z]{0,2}的格式为ARSAR。所以,首先尝试匹配整个正则表达式。如果找到匹配项,请尝试与SAR匹配,以深入挖掘。如果它与SAR匹配,您可以在下一步中转到AR。现在,如果它不匹配,则表示S是必需的块。因此,请尝试删除最后一个块(R)并尝试与SA匹配。等等。

答案 1 :(得分:0)

听起来你正在努力开发一些复杂的正则表达式吗?

我的建议是获得一个文本编辑器,它将实时突出显示匹配,并具有perl兼容的正则表达式引擎。

我自己使用Sublime Text 3,打开正则表达式( ctrl + f ,然后 alt + r )。

我将输入我要匹配的所有案例到文本区域。例如Wikipedia's Valid email address examples

我的正则表达手册是 oniguruma RE doc

编辑 :链接的RE.txt文档似乎已经死了,所以我在github gist上镜像了它:RE.txt (https://gist.github.com/thorsummoner/63811b64a4a9b7860187)

替代地

您尝试做的可能不适合正则表达式。听起来您正在尝试进行部分单词匹配或最佳匹配选择。

也许您应该考虑更精细的粒度逻辑和子串,字符索引检查。

免责声明:我觉得我对你的问题或用例没有把握