我从文件中读取了这个字符串:
abc | abc(abc \ | abc)| def
我希望数组中包含3个项目:
如何正确编写正则表达式?
line.split("(?!<=\\)\\|")
不起作用。
答案 0 :(得分:2)
<强>代码:强>
public class __QuickTester {
public static void main (String [] args) {
String test = "abc|abc (abc\\|abc)|def|banana\\|apple|orange";
// \\\\ becomes \\ <-- String
// \\ becomes \ <-- In Regex
String[] result = test.split("(?<!\\\\)\\|");
for(String part : result) {
System.out.println(part);
}
}
}
<强>输出:强>
abc
abc (abc\|abc)
def
banana\|apple
orange
注意:您需要\\\\
(4个反斜杠)才能将\\
(2个反斜杠)作为字符串,然后\\
(2个反斜杠)在Regex中成为单个\
。
答案 1 :(得分:0)
试试这个正则表达式:([\w()]|(\\|))+
答案 2 :(得分:0)
您的方法中的主要问题是\
在regex中是特殊的,但在String中也是如此。因此,要创建\
文字,您需要将其转义两次:
\\
"\\\\"
中的因此您需要将其写为split("(?<!\\\\)\\|")
但是这种方法也存在一些问题,因为|
上的\
分割之前很简单\
可能容易出错。因为您使用\
作为特殊字符来创建\\
文字,所以您可能需要将其编写为c:\foo\bar\
,例如创建c:\\foo\\bar\\
您可能需要在其中编写它文字为abc|foo\|c:\\bar\\|cde
。
因此,在这种情况下,我们可以说要分割文本,如
abc|foo\|c:\\bar\\|cde
^ ^
我假设你只想在这个地方分开
abc|foo
因为
|
管道\
中的bar\\|cde
,\
中虽然管道前面有\
,但我们知道此|
并未用于转义\
,而是生成代表{{ 1}}文字(通常为|
,其中包含非{偶数\
个字符,可以拆分。)但split(onEachPipeWhichHaveBackslashBeforeIt)
与split("(?<!\\\\)\\|")
bar\\|cde
不同,因为在\
之前|
会阻止此类分割,因此\
之间不会分开|
。
要解决这个问题,你可以检查split("(?<!(?<!\\\\)((\\\\){2}){0,1000}\\\\)\\|")
之前是否有奇数1000
,但这在Java中很难做到,因为后视需要有限的宽度。
可能的解决方案是\
并假设字符串永远不会包含超过|
个连续\
个字符,但它似乎有点过分。
IMO更好的解决方案是搜索您想要查找的字符串,而不是搜索您想要拆分的字符串。你要找的字符串是
|
\
开头的字符(包括(\\\\.|[^|])+
\\\\.
以后只会逃避它。)因此,我们的正则表达式看起来像[^|]
(我在开始时放置\
以阻止Pattern p = Pattern.compile("(\\\\.|[^|])+");
Matcher m = p.matcher(text);
while (m.find()){
System.out.println(m.group());
}
使用abc
foo\|c:\\bar\\
cde
消耗 $.ajax({
url: "rest/api/crunchifyService/jsonpost",
method: "POST",
data: JSON.stringify(jsonObj),
dataType: 'json',
contentType: "application/json",
success: function(result,status,jqXHR ){
//Do something
},
error(jqXHR, textStatus, errorThrown){
//Do something
}
});
,这将用于转义其他字符。)
示例:
<servlet>
<servlet-name>proxy</servlet-name>
<servlet-class>org.mitre.dsmiley.httpproxy.ProxyServlet</servlet-class>
<init-param>
<param-name>targetUri</param-name>
<param-value><!-- Cross domain URL goes here --></param-value>
</init-param>
<init-param>
<param-name>log</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>proxy</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
输出:
{{1}}