Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化这个正则表达式?_Java_Regex - Fatal编程技术网

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}