用正则表达式和条件分割角色

时间:2016-01-05 21:11:15

标签: java regex split

我尝试使用以下条件分割字符串

  • 保留所有字符
  • 如果前一个字符不是=%
  • ,请在!左右分开
  • 分开!=

示例

  

test = 45 - > [test,=,45]
  test!= 45 - > [test,!=,45]
  test%= 45 - > [试验(%)= 45]

代码

private static final Map<String[], String> tests = new HashMap<>();

static {
    tests.put(new String[]{"test", "=", "45"}, "test=45");
    tests.put(new String[]{"test", "!=", "45"}, "test!=45");
    tests.put(new String[]{"test%=45"}, "test%=45");
    tests.put(new String[]{"test", "=", "%=45"}, "test=%=45");
    tests.put(new String[]{"test%=", "=", "%=45"}, "test%==%=45");
}

@org.junit.Test
public void simpleTest() {
    String regex = "(?=!=)|(?<=!=)|(?<![!%])((?<==)|(?==))";
    for (Map.Entry<String[], String> entry : tests.entrySet()) {
        Assert.assertArrayEquals(entry.getKey(), entry.getValue().split(regex));
    }
}

&#34; best&#34;我发现的事情是(?=!=)|(?<=!=)|(?<![!%])((?<==)|(?==)),但我不知道为什么%=之后它会分开((?<==)似乎已被执行)
左右字符可以是任何ACII表。

结果

  

test = 45 - &gt; [test,=,45]
  test!= 45 - &gt; [test,!=,45]
  test%= 45 - &gt; [ test%=,45 ]&lt; - 应为[test%= 45]
  test =%= 45 - &gt; [test,=,%=,45 ]&lt; - 应为[test,=,%= 45]
  test%==%= 45 - &gt; [test%=,=,%=,45 ]&lt; - 应为[test%=,=,%= 45]

是否可以使用正则表达式进行分割?

注意:这只是正则表达式的一部分,它已经习惯了&#34;轻松&#34;解析数据,所以是的,我可以用简单的代码而不是使用正则表达式和拆分来完成它,但这不是我要求的。

2 个答案:

答案 0 :(得分:1)

您需要将lookbehind移动到检查等号存在的外观:

(?<=!=)|(?=!=)|((?<=(?<![!%])=)|(?=(?<![!%])=))

请参阅this demo

我修改了这部分:((?<=(?<![!%])=)|(?=(?<![!%])=))

( 
 (?<=(?<![!%])=) - matches a location preceded by a = sign that is not preceded with ! or %
 |
 (?=(?<![!%])=) - matches a location followed by a = sign that is not preceded with ! or %
)

答案 1 :(得分:1)

您可以使用像这样的正则表达式

(?=!=|(?<![!%])=)|(?<=!=|(?<![!%])=)

提取为前瞻和后方部分重复的核心部分:

String core  = "!=|(?<![!%])=";
String regex = "(?=" + core + ")|(?<=" + core + ")";

Regex101 Demo Ideone Demo

正则表达式突破仅核心

  !=         # A literal '!='
  |          # OR
  (?<![!%])= # A literal '=' that is not preceded by '!' or '%'