我可以获得以$startMsg$
开头和以$endMsg$
结尾的多个字符串。因此,以下是可接受和不可接受的:
$startMsg$abcd$endMsg$
:允许$startMsg$abcd$endMsg$aaa
:不允许,因为$ endMsg $之后是aaa
$startMsg$abcd$endMsg$xyz$endMsg$
:不允许$startMsg$abcd$endMsg$xyz$startMsg$
:不允许$startMsg$abcd$endMsg$xyz$startMsg$dad$endMsg$
:允许$startMsg$abcd$endMsg$xyz$endMsg$dad$startMsg$
:不允许$startMsg$abcd$endMsg$
:不允许,因为aaa
之前有$startMsg$
我尝试过这样的事情:
^((\$startMsg\$[^(\$startMsg\$>>)(\$endMsg\$)]*\$endMsg\$))*$
我可以获得以$startMsg$
开头和以$endMsg$
结尾的多个字符串。因此,以下是可接受和不可接受的:
$startMsg$abcd$endMsg$
:允许$startMsg$abcd$endMsg$aaa
:不允许,因为$ endMsg $之后是aaa
$startMsg$abcd$endMsg$xyz$endMsg$
:不允许$startMsg$abcd$endMsg$xyz$startMsg$
:不允许$startMsg$abcd$endMsg$xyz$startMsg$dad$endMsg$
:允许$startMsg$abcd$endMsg$xyz$endMsg$dad$startMsg$
:不允许$startMsg$abcd$endMsg$
:不允许,因为aaa
之前有$startMsg$
我尝试过这样的事情:
^((\$startMsg\$[^(\$startMsg\$>>)(\$endMsg\$)]*\$endMsg\$))*$
^
开头:字符串的开头\$
:转义$
$
结尾:字符串的结尾但这似乎是不正确的。
但这似乎是不正确的。我如何在python中做到这一点?
允许[^(\$startMsg\$>>)(\$endMsg\$)]*
匹配任何不包含$startMsg$
和$endMsg$
的字符串。看来,平原不?但是那我应该如何在不使用正则表达式的情况下做到这一点呢?
或者这与正则表达式完全无关,因为它与下推式自动机有关,因此,对于有限自动/正则表达式绝对不能完全消除。
答案 0 :(得分:2)
选中此正则表达式,该正则表达式可以很好地用于您提到的示例。
@Resource(name = "domainNameToCode")
private Map<String, Integer> domainCodes;
如果在开始和结束之间除了字符之外还有其他内容,请更改 \ w 。
然后,如果您只是想抓住字符串开头和结尾之间的字符,请在顶部使用以下正则表达式
^(\$startMsg\$)((\w)*(\$endMsg\$\w+\$startMsg\$)*(\w)*)*(\$endMsg\$)$
这将列出字符。
答案 1 :(得分:0)
If you really want to use regex
^((\$startMsg\$)[^$]*?(\$endMsg\$)(([^$]*?)(?=\$startMsg\$)|.{0}))*?$
不幸的是,您不能将[]
构造与字符序列一起使用,只能使用单个字符。因此,相反,您可以使用LookAhead / LookBehind(分别为(?=...)
和(?<=...
)和一个惰性量词来匹配直到该序列之前的所有内容,就像我对([^$]*?)(?=\$startMsg\$)
所做的那样。
我应该提一下,绝对有其他方法比这种混乱的情况更具可读性。正则表达式很酷,但是像这样的复杂序列却令人困惑且难以理解,因此应尽可能避免使用。