Java Regex:基于具有异常的多个条件进行拆分

时间:2016-09-24 21:31:27

标签: java regex

我想创建一个正则表达式,以便我可以使用以下约束在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。

1 个答案:

答案 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