我在java中遇到了文本模式的问题。我想使用此模式来验证插入的文本以过滤表格中的文本。此文本可以包含"!"(不)和" *"(如?)。我也有可能使用& (和)和|(或)将逻辑表达式与文本操作(endsWith,startsWith,contains)连接在一起。我究竟想要的是避免插入不验证文本。无效文本的示例
-
!
!*
*!
!!
**
*!
!*
A**
**A
*A&
&A*
有效文字的例子
A*
*A
*-*
!a|b&c|!ab
!a|*b&c*|!*ab
!*aa*|*sdb&casd*|!*aasdb*
!*aa|*sdb&casd*|!*aasdb*
S*|L*
使用我的模式"\s*(!?\*?[^&\|]*[&\|])*!?\*?[^&\|]*\*?\s*"
,两个组都有效。我试过差异组合,但没有成功。有什么想法吗?
答案 0 :(得分:1)
您对自己所描述的内容的描述以及您的示例并非绝对清晰。例如,*-*
有效,表示-
是有效的过滤字符,那么为什么只有-
无效?这不符合逻辑。
但是从我能收集的内容来看,你是在这样的事情之后:
\s*(?:!?\*?[^&|*!\n]+\*?[&|])*!?\*?[^&|*!\n]+\*?\s*
它为第一个可选部分使用非捕获组。如果存在,则以|
或&
结尾。然后是非可选部分,它是相同的,除了没有终止运算符:
可选的!
,可能后跟可选的*
。然后,任何字符但一个&
,|
,!
或换行符 - 至少一个。最后,可以选择*
。
请注意,不锚定到开头和结尾(^
和$
)意味着使用java的matches
方法,这样做会为您做到这一点。使用另一种方法或其他正则表达式的味道,将需要添加这些方法,或者这将基本匹配任何内容。