如何为多个出现的分隔字符串编写正则表达式

时间:2018-09-27 14:54:48

标签: python regex

我可以获得以$startMsg$开头和以$endMsg$结尾的多个字符串。因此,以下是可接受和不可接受的:

  1. $startMsg$abcd$endMsg$:允许
  2. $startMsg$abcd$endMsg$aaa:不允许,因为$ endMsg $之后是aaa
  3. 期望$ startMsg $,但仅找到$ endMsg $。
    $startMsg$abcd$endMsg$xyz$endMsg$:不允许
  4. 未找到匹配的$ endMsg $。
    $startMsg$abcd$endMsg$xyz$startMsg$:不允许
  5. $startMsg$abcd$endMsg$xyz$startMsg$dad$endMsg$:允许
  6. 在$ startMsg $之前找到
  7. $ endMsg $。
    $startMsg$abcd$endMsg$xyz$endMsg$dad$startMsg$:不允许
  8. aaa $startMsg$abcd$endMsg$:不允许,因为aaa之前有$startMsg$

我尝试过这样的事情:

 ^((\$startMsg\$[^(\$startMsg\$>>)(\$endMsg\$)]*\$endMsg\$))*$

我可以获得以$startMsg$开头和以$endMsg$结尾的多个字符串。因此,以下是可接受和不可接受的:

  1. $startMsg$abcd$endMsg$:允许
  2. $startMsg$abcd$endMsg$aaa:不允许,因为$ endMsg $之后是aaa
  3. 期望$ startMsg $,但仅找到$ endMsg $。
    $startMsg$abcd$endMsg$xyz$endMsg$:不允许
  4. 未找到匹配的$ endMsg $。
    $startMsg$abcd$endMsg$xyz$startMsg$:不允许
  5. $startMsg$abcd$endMsg$xyz$startMsg$dad$endMsg$:允许
  6. 在$ startMsg $之前找到
  7. $ endMsg $。
    $startMsg$abcd$endMsg$xyz$endMsg$dad$startMsg$:不允许
  8. aaa $startMsg$abcd$endMsg$:不允许,因为aaa之前有$startMsg$

我尝试过这样的事情:

 ^((\$startMsg\$[^(\$startMsg\$>>)(\$endMsg\$)]*\$endMsg\$))*$
  • ^开头:字符串的开头
  • \$:转义$
  • $结尾:字符串的结尾

但这似乎是不正确的。

但这似乎是不正确的。我如何在python中做到这一点?

允许[^(\$startMsg\$>>)(\$endMsg\$)]*匹配任何不包含$startMsg$$endMsg$的字符串。看来,平原不?但是那我应该如何在不使用正则表达式的情况下做到这一点呢?

或者这与正则表达式完全无关,因为它与下推式自动机有关,因此,对于有限自动/正则表达式绝对不能完全消除。

2 个答案:

答案 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\$)所做的那样。

我应该提一下,绝对有其他方法比这种混乱的情况更具可读性。正则表达式很酷,但是像这样的复杂序列却令人困惑且难以理解,因此应尽可能避免使用。