Java 如何优化这个正则表达式?
我有以下案文:Java 如何优化这个正则表达式?,java,regex,Java,Regex,我有以下案文: 标签前bla bla bla aaaabbbbb bla bla bla abcdefh后 这个正则表达式: label\W+(?:\w+\W+){1,60}?(?:.){0,}?(\<TAG1\>|\<TAG2\>)(?:.){0,}?\W+(?:\w+\W+){1,60}(?:.){0,}?(\<TAG2\>|\<TAG1\>)(?:.){0,}? label\W+(?:\W+\W+{1,60})(?:){0,}(\\\)(?
标签前bla bla bla aaaabbbbb bla bla bla abcdefh后
这个正则表达式:
label\W+(?:\w+\W+){1,60}?(?:.){0,}?(\<TAG1\>|\<TAG2\>)(?:.){0,}?\W+(?:\w+\W+){1,60}(?:.){0,}?(\<TAG2\>|\<TAG1\>)(?:.){0,}?
label\W+(?:\W+\W+{1,60})(?:){0,}(\\\)(?:){0,}?\W+(?:\W+\W+{1,60}(?:){0,}(?:){0,}?
它完成了任务,工作如预期,但似乎没有真正优化
这是一个测试:
基本上,我必须找到一个标签,在N个单词之后我应该得到
或
,在N个单词之后我应该得到
或
注意:
必须将
或
视为单词的可能“子字符串”,这一点非常重要。有时它可以是aaaabbbb
,有时直接是
。正如您在示例中看到的,它在这两种情况下都有效。将正则表达式可视化通常有助于:
请注意,(?:){0,}?
是一种迂回的说法。现在也很容易看到,有两个相同的块可以合并,所以让我们来解决这个问题:
label\W+(?:(?:\w+\W+){1,60}?.*(\<TAG1\>|\<TAG2\>).*){2}
这与之前的模式不完全相同-它与示例字符串中的之后的不匹配(从您的描述中不清楚是否应该匹配)。如果要在第二个标记后保持匹配,只需在末尾添加一个*
综上所述,它看起来很像是在解析一个复杂的语法(即a),就是这样。如果您发现自己正在编写和重写正则表达式,试图使其捕获所需的数据,则可能需要升级到适当的上下文解析器
特别是,无论是正则表达式还是我的调整都不会强制执行N
每次都是相同的。您的描述听起来似乎只想匹配第一个标记前面有N
个单词的字符串,而在第一个标记和第二个标记之间正好有N
个单词。对于正则表达式,这种匹配可能是可能的,但它肯定不是干净的。如果这是一个要求,正则表达式可能不是正确的工具。所有的“n单词”内容似乎都是多余的,因为您已经在标记之前、之间和之后匹配了“any”。我不必解析HTML文档。和是我需要检查的单词示例。但是它可以被“狗”和“猫”代替。然而,我的目标是一种文本挖掘,我必须找到特定的模式并提取内容。什么是适合您的工具?我没有说您正在解析HTML文档,我说您可能正在解析非常规语言(HTML是此类语言的常见示例)。一种流行的语法生成器和解析器是,但还有许多其他的。
label\s+(?:(?:\w+\s*)+(\<TAG1\>|\<TAG2\>)\w*){2}