避免使用正则表达式的可选单词

时间:2016-06-24 07:13:26

标签: java regex

我正在尝试为此实现一个正则表达式:

Line 1: OPEN_SESSION (AAAA) xxxx.yyyy
Line 2: OPEN_SESSION zzzz

获取 xxxx.yyyy zzzz ,但我无法避免这个恼人的括号。我尝试过:

OPEN_SESSION[\s](?:\(*AAAA*\))?([A-Za-z0-9-_.]{4,20})

但它不起作用。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可能忘记了正则表达式末尾的括号: OPEN_SESSION[\s](?:\(*AAAA*\))?([A-Za-z0-9-_.]{4,20})

但这仍然无效。

试试这个: OPEN_SESSION\s(?:\(AAAA\))?([\w \.]{4,20})

如果您需要在第二部分中接受空格字符,只需在正则表达式中添加\_ OPEN_SESSION\s(?:\(AAAA\))?([\w \_ \.]{4,20})

答案 1 :(得分:0)

你的表情几乎是正确的。它无法工作的唯一原因是你忘记了(AAAA)之后的可选空间。此外,它还应该丢弃匹配,直到那一点 - 即匹配(因为它在您的解决方案中)包括OPEN_SESSION(包括空格)。如果你想要排除在外:

PCRE版本:

OPEN_SESSION[\s](?:\(*AAAA\)*[\s])?\K([[:alnum:]-_\.]{4,20})

\K在此之前丢弃所有内容。

我做的唯一其他改变(除了在\ K之前添加额外的[\ s]),是因为我使用了字符类[:alnum:]这实际上是[A-Za-z0-的缩写] 9]。但这是个人偏好的问题 - 它不会改变最终结果。

Java版:

(?:OPEN_SESSION[\s][(]*[A]*[)]*[\s]?)([A-Za-z0-9_\-.]{4,20})