Java正则表达式问题:### tag1 @@@ value1 ### tag2 @@@ value2 ### tag3 @@@@ value3 ###

时间:2019-08-22 16:57:34

标签: java regex

我在编写正则表达式以验证以下模式时遇到麻烦:

###tag1@@@value1###tag2@@@value2###tag3@@@value3###
  • 这可以无限期重复
  • 标签和值可以包含任何可打印的字符以及空格和换行符

我一直在尝试这种变化:

String pattern = "(###[\\p{Print}\\s]+@@@[\\p{Print}\\s]+)+###"

但是在某些情况下(例如:

),它并没有强制执行该模式。
###testTag@@@testValue###testtag2testvalue2### (missing the @@@ for tag2/value2)

及其使某些有效输入无效,例如:

###component@@@CORE COMMAND GROUP###severity@@@DEBUG###message@@@Validating potential model load directory: C:/some/dir/market-xxxxxx/market-xxxxxx-PRODUCT-kit/data/XXX_7020190724201513_0X###

关于如何改进此正则表达式的任何建议?谢谢!

我正在使用Java模式库。

3 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式”

final String regex = 
 "^(?:###(?:(?!@@@|###)\\P{C})+@@@(?:(?!@@@|###)\\P{C})+)+###$";

RegEx Demo

  • \P{C}匹配任何可打印的unicode字符
  • (?:(?!@@@|###)\\P{C})与任何可打印的unicode字符匹配,前提是该字符不能紧跟###@@@

答案 1 :(得分:1)

这很好用:

String s1 = "###tag1@@@value1###tag2@@@value2###tag3@@@value3###";
String s2 = "testTag@@@testValue###testtag2testvalue2###";
String s3 = "component@@@CORE COMMAND GROUP###severity@@@DEBUG###message@@@Validating potential model load directory: C:/some/dir/market-xxxxxx/market-xxxxxx-PRODUCT-kit/data/XXX_7020190724201513_0X###";

String p = "(###|^)?(((\P{C})+?@@@(\P{C})+?)###|$)+?";

Matcher m1 = p.matcher(s1); // testTag@@@testValue
Matcher m2 = p.matcher(s2); // tag1@@@value1, tag2@@@value2, tag3@@@value3
Matcher m3 = p.matcher(s3); // component@@@CORE COMMAND GROUP, severity@@@DEBUG 

答案 2 :(得分:0)

这几乎可以使您到达那里:

(###)((.+?)(@@@)(.+?)(###))

https://regex101.com/r/5rfpL0/4

我很难找出原因:

(###)((.+?)(@@@)(.+?)(###))+

没有使其表现出预期的效果:-/