【问题标题】:Java Regex - Match Any Part of Regular ExpressionJava Regex - 匹配正则表达式的任何部分
【发布时间】:2014-02-18 03:54:16
【问题描述】:

考虑一个模糊的正则表达式,例如[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 到的字母范围一些有限的数字,一个或多个字母,可以填补“空白”的特定数量的字母,另一个字母范围,除了这次是特定的,等等。

我已经花费了数小时来思考和尝试不同的代码位来尝试拆分正则表达式并测试每个拆分,然后将一些拆分合并在一起以尝试创建每种可能性。最终我屈服于挑战并决定寻求帮助。很难描述我想要完成的工作,所以我希望我做得足够好。请多多包涵。

【问题讨论】:

  • 所以基本上你想找到匹配的最短的子正则表达式?

标签: java regex string loops split


【解决方案1】:

听起来您正在尝试开发一些复杂的正则表达式,是吗?

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

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

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

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

编辑:链接的 RE.txt 文档似乎已失效,因此我在此处将其镜像到 github 要点:RE.txt (https://gist.github.com/thorsummoner/63811b64a4a9b7860187)

或者

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

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

免责声明:我觉得我不了解您的问题或用例

【讨论】:

    【解决方案2】:

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

    1. 单个字母(例如,ae)。叫这个 S。
    2. 字母范围(例如,[a-z][p-r])。称它为 A。
    3. 固定出现次数(例如,{2}{3})。叫这个 F。
    4. 出现次数的范围(例如,{2,4}{0,3})。称之为 R。

    您可以将正则表达式拆分为上述标记,并扫描每个子正则表达式以查找匹配项。例如,[a-z]{0,9}f[a-z]{0,2} 的形式为 ARSAR。所以,首先尝试匹配整个正则表达式。如果找到匹配项,请尝试与SAR 进行匹配以深入挖掘。如果它与SAR 匹配,您可以在下一步中选择AR。现在如果不匹配,则表明S 是必需的块。所以尝试删除最后一个块(R)并尝试匹配SA。以此类推。

    【讨论】:

    • 我绝对喜欢这种解决问题的方法。问题是如何实施。我自己会搞乱实施,但如果你有时间,你介意帮助我吗?我将不胜感激!
    • 发布您尝试过的内容,以及您的预期结果。我仍然不确定我是否正确理解了这个问题,所以如果你发布你的实现会很有帮助。
    • 我有相当多的代码......什么是最好的发布方式?
    猜你喜欢
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2017-06-23
    • 1970-01-01
    相关资源
    最近更新 更多