Java Regex:基于除撇号之外的非单词字符进行拆分

时间:2016-09-19 17:15:29

标签: java regex

我正在尝试基于空格和非单词字符进行拆分和包含,除了撇号。

我已经能够将它拆分并包含空格和非单词字符,但我似乎无法弄清楚如何从非单词字符中排除撇号。

这是我现在的正则表达式......

str.split("\\s|(?=\\W)");

...在此代码示例上运行时:

program p;
begin
    write('x');
end.

...产生这个结果:

program
p
;
begin

write
(
'x   <!-- This is the problem.
'
)
;
end
.

这几乎是正确的,但我的目标是跳过撇号,这就是结果:

program
p
;
begin

write
(
'x'   <!-- This is the wanted result.
)
;
end
.

更新

正如我所建议的那样:

str.split("\\s|(?=\\W)(?<=\\W)");

哪个几乎有效,但没有正确分割所有特殊字符:

program
p;
begin
write(
'x'
)
;
end.

4 个答案:

答案 0 :(得分:5)

你试过......

[^\w']

这将匹配任何既不是单词字符也不是撇号的字符。可能很简单,根据您的输入工作。

如果您使用[^\w']作为正则表达式并使用\n\1\n作为替换字符串来运行替换操作,那么它应该会让您接近您想要的位置。

答案 1 :(得分:1)

你可以分开这个。

\s|('[^']*')|(?=\W)

参见演示。

https://regex101.com/r/mL7eL6/1

答案 2 :(得分:0)

单独处理撇号并要求前面的非单词:

str.split("\\s+|(?=[^\\w'])|(?<=\\W)(?=')");

请参阅live demo

答案 3 :(得分:0)

也可以扫描字符串以查找 \ b [\ w'] + \ b