Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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,我正在寻找一种简化正则表达式的方法,它由值(例如12345)、关系符号(,=)和连接符(&,!)组成。例如,表达方式: >= 12345 & <=99999 & !55555 (^<=|^<= | ^>= | ^>= |^<|^>|^< |^> |^)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&

我正在寻找一种简化正则表达式的方法,它由值(例如12345)、关系符号(,=)和连接符(&,!)组成。例如,表达方式:

>= 12345 & <=99999 & !55555 
(^<=|^<= | ^>= | ^>= |^<|^>|^< |^> |^)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*

=12345&| ^((!|))([0-9]{1,5}))(&>|&<|&>=|&>=|&您可以将所有空格设置为可选(带问号),这样您就不必显式列出所有可能性。您还可以将相等/不相等符号分组到字符集中([])

像这样,我想

(^[<>]=?\s?)((!|)([0-9]{1,5}))(\s?&\s?[<>]=?\s|$)*
(^[]=?\s?(!)([0-9]{1,5}))(\s?&\s?[]=?\s |$)*
怎么样

[]=?|\d{1,5}.[&!\\\124;]


这就解决了你的>/>=/<我有一个两步的程序。首先由junctor中断,然后检查各个部件

final String expr = ">= 12345 & <=99999 & !55555".replaceAll("\\s+", "");
for (String s : expr.split("[|&]"))
  if (!s.matches("([<>]=?|=|!)?\\d+")) { System.out.println("Invalid"); return; }
System.out.println("Valid");

final String expr=“>=12345&您似乎花费了大量精力来匹配可选空格。像
\s?
(0-1)或
\s*
(0-many)之类的东西会更好

此外,被某物分隔的重复项总是很困难的。最好为“thing”创建一个regexp,以简化重复

limit = '\s*([<>]=?|!)\s*\d{1,5}\s*'
one_or_more = '^' + limit + '(&' + limit + ')*$'
limit='\s*([]=?|!)\s*\d{1,5}\s*'
一个或多个=“^”+限制+”(&“+限制+”)*$”
或者,扩展到:

^\s*([<>]=?|!)\s*\d{1,5}\s*(&\s*([<>]=?|!)\s*\d{1,5}\s*)*$
^\s*([]=?|!)\s*\d{1,5}\s*(&\s*([]=?|!)\s*\d{1,5}\s*)*$
另外,
是一个“关系符号”,如果我理解正确,它不是一个“连接符”

(对于提倡使用“真正的”解析器的人来说,上面的结构(一个或多个
)可能就是实现&-分隔列表的方式;如果您可以在语言中使用字符串连接,就不需要解析器了)。

这就是您想要的:

^(\s*([<>]=?)?\s*!?\d{1,5}\s*(&|$))*
^(\s*([]=?)?\s*!\d{1,5}\s*(&|$)*
这些对总和子表达式的解释应该有助于您理解整个事情:

\s*
:0个或更多空格
([]=?)?
:一个
符号,可选后跟一个
=
,所有符号都是可选的
!?
:和可选的

\d{1,5}
:1-5位

(&|$)
:从正则表达式开始的
&
或字符串结尾,可以执行以下简化步骤:

 (^<=|^<= | ^>= | ^>= |^<|^>|^< |^> |^)((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
((!)([0-9]{1,5}))(&>和&>这是可选的

^((<=|>=|<|>)? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*

^(=|)|?(!|)|([0-9]{1,5}))(&>|&<|&>=|&>=|&&&&&&&&&&&&&&&&&&&>=|&>=|&>=|&>=|&>=|请显示一些匹配项和结果,可能还有一些非匹配项示例。这将有助于我们理解您要执行的操作。如果表达式的长度可以是任意的,那么您可能需要做一些比常规表达式更实际的操作否则,它会变得非常难看和难以阅读。使用上下文无关语法()@杰夫:如果这真的只是一系列交替的数字和运算,那么CFG可能仍然是一个滥杀。这将匹配“=”,更不用说“>=>”、“=>”,等等。@kevlar1818:对,但是这些可能会发生吗?[]=?确实更好,但经过编辑。否认模式的发生(尽管模式不太可能)这不是很好的正则表达式礼节。很好的一个@kevlar1818。但是它不也会“>=我建议用
([]=?!)\s*\d{1,5}\s*)(&\s+([]=?!)\s*\d{1,5}\s*)*
来增强你的答案。你觉得@kevlar1818怎么样?
^(<=|<=|>=|>=|<|>|<|>|) ?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
^(<=|>=|<|>|) ?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
^((<=|>=|<|>)? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
^((<|>)=? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
^([<>]=? ?)?((!|)([0-9]{1,5}))( & > | & < |& >=|&>=|&<=||&<=|&>=|&<|&>|&| &| & |$))*
^([<>]=? ?)?((!|)([0-9]{1,5}))( ?(& ?([<>]=?)?)?|$)