我想创建一个正则表达式,以便我可以使用以下约束在Java中拆分字符串:
Any non-word character, except for:
(a) Characters surrounded by ' '
(b) Any instance of := >= <= <> ..
这样对于以下示例字符串:
print('*'); x := x - 100
我可以在String[]
中获得以下结果:
print
(
'*'
)
;
x
:=
x
-
100
这是我目前所拥有的正则表达式:
str.split("\\s+|"+
"(?=[^\\w'][^']*('[^']*'[^']*)*$)|" +
"(?<=[^\\w'])(?=[^']*('[^']*'[^']*)*$)|" +
"(?=('[^']*'[^']*)*$)|" +
"(?<=')(?=[^']*('[^']*'[^']*)*$)");
但这给了我以下结果:
print
(
'*'
)
;
x
:
= <!-- This is the problem. Should be above next to the :
x
-
100
更新
我现在已经了解到使用Regex无法实现这一目标。
但是,我仍然不能使用任何外部或框架或词法分析器,并且必须使用包含的Java方法,例如StringTokenizer。
答案 0 :(得分:1)
免责声明:正则表达式不是通用解析器。如果你正在阅读的文本是一个复杂的语言,使用嵌套的结构,那么你需要使用一个实际的词法分析器,而不是一个正则表达式。例如。下面的代码支持&#34;字符包围&#39; &#39;&#34;,这是一个简单的定义,但如果字符可以包含转义的'
个字符,那么您需要一个词法分析器。
请勿使用split()
。
如果使用find()
循环,您的代码将更容易阅读和理解。它的表现也会更好。
您编写正则表达式以指定要在find()
循环的一次迭代中捕获的内容。您可以依靠|
选择匹配的第一个模式,因此首先放置更具体的模式。
Pattern p = Pattern.compile("\\s+" + // sequence of whitespace
"|\\w+" + // sequence of word characters
"|'[^']*'" + // Characters surrounded by ' '
"|[:><]=" + // := >= <=
"|<>" + // <>
"|\\.\\." + // ..
"|."); // Any single other character
String input = "print('*'); x := x - 100";
for (Matcher m = p.matcher(input); m.find(); )
System.out.println(m.group());
<强>输出强>
print
(
'*'
)
;
x
:=
x
-
100