1

在我之前问的一个问题中,

使用高级正则表达式在java中拆分字符串

有人给了我一个很好的答案来解决我的问题(如上面的链接所述),但我从未设法完全理解它。有人可以帮助我吗?我得到的正则表达式是这个”

"(?s)(?=(([^\"]+\"){2})*[^\"]*$)\\s+"

我可以理解一些基本的东西,但是这个正则表达式的某些部分即使在彻底搜索谷歌之后我也找不到,比如开头 s 之前的问号,或者第二个括号如何与问号和方程一起工作一开始。是否也可以扩展它并使其能够与其他类型的引号一起使用,例如“ ”?

非常感谢任何帮助。

4

3 回答 3

2

"(?s)(?=(([^\"]+\"){2})*[^\"]*$)\\s+"解释;

(?s)    # This equals a DOTALL flag in regex, which allows the `.` to match newline characters. As far as I can tell from your regex, it's superfluous.
(?=     # Start of a lookahead, it checks ahead in the regex, but matches "an empty string"(1) read more about that [here][1] 
(([^\"]+\"){2})*  # This group is repeated any amount of times, including none. I will explain the content in more detail.
    ([^\"]+\")    # This is looking for one or more occurrences of a character that is not `"`, followed by a `"`. 
    {2}           # Repeat 2 times. When combined with the previous group, it it looking for 2 occurrences of text followed by a quote. In effect, this means it is looking for an even amount of `"`.
[^\"]*  # Matches any character which is not a double quote sign. This means literally _any_ character, including newline characters without enabling the DOTALL flag
$       # The lookahead actually inspects until end of string.
)       # End of lookahead
\\s+    # Matches one or more  whitespace characters, including spaces, tabs and so on

那里重复两次的复杂组将匹配此字符串中不在两者之间的空格"

text that has a "string in it".

与 String.split 一起使用时,将字符串拆分为;[text, that, has, a, "string in it".]

只有偶数个"才会匹配,因此以下将匹配所有空格;

text that nearly has a "string in it.

将字符串拆分为[text, that, nearly, has, a, "string, in, it.]

(1) 当我说一个捕获组匹配“一个空字符串”时,我的意思是它实际上什么都没有捕获,它只是从你所在的正则表达式中的点向前看,并检查一个条件,实际上没有捕获任何内容。实际捕获是\\s+在前瞻之后完成的。

于 2013-05-27T11:05:00.000 回答
1

(?s)部分是一个嵌入的标志表达式,启用该DOTALL模式,其含义如下:

在 dotall 模式下,表达式 . 匹配任何字符,包括行终止符。默认情况下,此表达式不匹配行终止符。

(?=expr)是一个前瞻表达式。这意味着正则表达式看起来匹配expr,但在继续进行其余评估之前会移回同一点。

在这种情况下,这意味着正则表达式匹配任何出现\\s+,即后跟任意偶数个",然后是非-"直到结束 ( $)。换句话说,它检查"前面是否有偶数个。

它也绝对可以扩展到其他报价。唯一的问题是([^\"]+\"){2}部分,可能必须使用反向引用 ( \n) 而不是{2}.

于 2013-05-27T10:56:08.877 回答
1

这个比较简单。。

概念

只要前面\s+偶数个,它就会分裂。"

例如:

Hello hi "Hi World"
     ^  ^   ^
     |  |   |->will not split here since there are odd number of "
     ----
      |
      |->split here because there are even number of " ahead

语法

\s匹配一个\n\rspace\t

+是与前一个字符或组 1 匹配多次的量词

[^\"]会匹配任何东西,除了"

(x){2}将匹配x2 次

a(?=bc)如果 a 后跟 bc 则匹配

(?=ab)a将首先从当前位置检查 ab,然后返回到它的位置。然后匹配 a。(?=ab)c不匹配 c

With (?s)(singleline mode).将匹配换行符。所以,在这种情况下不需要,(?s)因为没有.


我会用

\s+(?=([^"]*"[^"]*")*[^"]*$)
于 2013-05-27T10:56:19.140 回答