在带有特殊字符和并发症的空格上拆分 Java 字符串

Split Java string on spaces with special characters and complications

我有一个输入字符串:

-a  var1=Bat"m/an  -b   var2=" -a="lol "  -c  var3=" M^a%g-i=c "

分裂后我应该得到:

输出

- -a
- var1=Bat"m/an
- -b
- var2=" -a="lol "
- -c
- var3=" M^a%g-i=c "

规则:

我写了正则表达式,但引号内的引号搞砸了:

(?:"[^"]*"|\S)+

我也尝试在 =" 上明智地解析字符或拆分,但我面临歧义,因为它们也可以在引号内。

您可以将此正则表达式用于 匹配 和先行断言:

-?[a-z_]\w*(?:=".*?"(?=\h+(?:-[a-z](?=\h|$)|[a-z]\w*=)|$)|\S+)?

RegEx Demo

正则表达式解释:

  • -?:以可选的连字符开头
  • [a-z_]\w*:匹配以小写字母或下划线开头后跟0+字字符的变量
  • (?:: 启动非捕获组
    • ".*?"(?=...<expression>):匹配以双引号开头和结尾的带引号的字符串。使用前瞻,我们断言我们有另一个变量或前面的行尾。
    • |: 或
    • \S+:匹配1+个非空白字符
  • ):结束非捕获组

您可以尝试以下操作:

(-[a-z]|[^\s][^\s]*="?[^"]*"?[^\s]*)

所有参数及其值将作为单独的组捕获

解释:

Capturing Group (-[a-z]|[^\s][^\s]*="?[^"]*"?[^\s]*)
1st Alternative -[a-z]
2nd Alternative [^\s][^\s]*="?[^"]*"?[^\s]*
[^\s] - A character which should not be a space
[^\s]* - Matches all non space characters
= checks for equal to as mandatory
= matches the character = literally (case sensitive)
"? checks if " symbol is there
[^"]* checks for all symbols that are not as "
"? Again check for " as option
[^\s]* Finally again check for all non space characters

Demo Here

希望对您有所帮助 :) .