我在编写正则表达式以验证以下模式时遇到麻烦:
###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模式库。
答案 0 :(得分:1)
您可以使用此正则表达式”
final String regex =
"^(?:###(?:(?!@@@|###)\\P{C})+@@@(?:(?!@@@|###)\\P{C})+)+###$";
\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
我很难找出原因:
(###)((.+?)(@@@)(.+?)(###))+
没有使其表现出预期的效果:-/