我尝试使用以下条件分割字符串
=
或%
!
左右分开
!=
示例:
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;解析数据,所以是的,我可以用简单的代码而不是使用正则表达式和拆分来完成它,但这不是我要求的。
答案 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 + ")";
正则表达式突破(仅核心)
!= # A literal '!='
| # OR
(?<![!%])= # A literal '=' that is not preceded by '!' or '%'