Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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/Quickrex正则表达式:使用负lookahed时组中缺少字符_Java_Regex_Negative Lookahead - Fatal编程技术网

Java/Quickrex正则表达式:使用负lookahed时组中缺少字符

Java/Quickrex正则表达式:使用负lookahed时组中缺少字符,java,regex,negative-lookahead,Java,Regex,Negative Lookahead,在Java中(使用Eclipse Quickrex插件进行测试),我使用以下表达式: (^[\.\(&\)]*)(.*)(?!([\.\(&/\)]*$) 要匹配文本,请执行以下操作: (&&(…ABC---…D25../)(& 预期目标是匹配三组: (1) (&&()… (2) ABC---…D25 (3) …/)(& 我们的目标是继续第二个组,并删除前面的第1组和后面的第3组。要求用户自己在三个单独的GUI字段中定义所有三个正则表达式 发生的情况:三组在QuickRex中匹配良好,但在第2组

在Java中(使用Eclipse Quickrex插件进行测试),我使用以下表达式:

(^[\.\(&\)]*)(.*)(?!([\.\(&/\)]*$)

要匹配文本,请执行以下操作:

(&&(…ABC---…D25../)(&

预期目标是匹配三组:

(1)
(&&()…

(2)
ABC---…D25

(3)
…/)(&

我们的目标是继续第二个组,并删除前面的第1组和后面的第3组。要求用户自己在三个单独的GUI字段中定义所有三个正则表达式

发生的情况:三组在QuickRex中匹配良好,但在第2组中,
ABC---..D2
末尾的“5”缺失,也没有出现在第3组中:

[.(&&(…)][ABC-->D2]
5
[…../)(&]

环境:EclipseMars4.5.2、Java1.8.0\u66、QuickRex 4.3.0

两个问题:

这是匹配这些组的正确方法吗


“5”不包括在正则表达式引擎中是否有逻辑原因或错误?

5
不包括在正则表达式引擎中,因为它无法匹配,因为它是由于负前瞻
(?![(&/)]*$)
使引擎回溯并只查找
后面没有跟随的
2
&
/
符号

为了匹配您需要的两个组(正如您所提到的,第三个组将被丢弃),您可以将第二个组中贪婪的
*
量词转换为懒惰的
*?
(在后续子模式首次出现之前匹配除换行符以外的尽可能少的任何字符),并将负前瞻转换为一个组(要使
*?
在图案之前停止):

详细信息

  • ^
    -字符串/行的开头
  • ([.(&)]*)
    -组1从字符类捕获零个或多个字符
  • (.*)
    -除换行符以外的任何0+字符,在第一行之前尽可能少
  • ([.(&/)]*$)
    -
    ,或
    ,或
    &
    ,或
    /
    )或
    ,在字符串结尾处出现零次或多次

要回答第一个问题,我们需要知道规格。
5
不包括在内,因为它无法匹配,因为它是由于消极的前瞻
(?![.(&/)]*$)
使得引擎回溯并找到
2
,而
&
//code>、
/
、或
symbols。如果您不需要第三组,请尝试
(^[(&)]*(.*)(.*)(=[(&/)]*$)
。或者-
([^.]*(?:\(?!\)[^.]*(?:\)+\w*([^.]*(?:\(?!\)[^.]*(?:\)+\w*)
。请解释输入背后的规则。您好,Wiktor,非常感谢!第三组确实不是必需的,因此您的简短陈述似乎完全符合情况。好的,我将在我的答案中添加第一个表达式的解释。请检查并让我知道哪种方法更有效,我将提供更多解释。谢谢t、 Wiktor!也已测试:
(^[.(&)]*)(.*?([./&=()\s\\]*$)
^([.(&)]*)(.*?)([.(&/)]*$)