我从文件中读取这个字符串:如何通过Java正则表达式分割字符串与后面看?
abc |美国广播公司(ABC \ | ABC)| DEF
我想阵列inludes 3项:
- ABC
- 广播公司(ABC \ | ABC)
- 高清
如何正确写入正则表达式? line.split("(?!<=\\)\\|")
不起作用。
我从文件中读取这个字符串:如何通过Java正则表达式分割字符串与后面看?
abc |美国广播公司(ABC \ | ABC)| DEF
我想阵列inludes 3项:
如何正确写入正则表达式? line.split("(?!<=\\)\\|")
不起作用。
代码:
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中成为一个单独的\
。
试试这个正则表达式:([\w()]|(\\|))+
在你的方法主要问题是\
是在正则表达式特殊,而且在字符串。因此,要建立\
文字,你需要转义两次:
\\
"\\\\"
。所以你需要把它写为split("(?<!\\\\)\\|")
但也有因为使用这种拆分方法上|
这是简单的由\
之前可容易出错可能出现的问题。因为您使用\
作为特殊字符来创建\
文字,所以您可能需要将其编写为\\
,例如创建c:\foo\bar\
,您可能需要将其写入文本中作为c:\\foo\\bar\\
。
因此,在这种情况下,可以说,要像
abc|foo\|c:\\bar\\|cde
拆分文本我假设你要分割只有在这个地方
abc|foo\|c:\\bar\\|cde
^ ^
因为
abc|foo
pipe |
在它之前没有\
,bar\\|cde
\
前管,我们知道这\
不是用来逃跑|
,但以产生代表\
文字(所以一般|
具有非或偶数\
字符是OK拆分文本)。但split(onEachPipeWhichHaveBackslashBeforeIt)
像split("(?<!\\\\)\\|")
因为\
|
这将避免这种分裂之前,你不会bar\\|cde
之间的分裂。
为了解决这个问题,你可以检查|
之前是否有奇数的\
,但是这在Java中很难做到,因为后视需要限制宽度。
可能的解决方案将是split("(?<!(?<!\\\\)((\\\\){2}){0,1000}\\\\)\\|")
和假设字符串将永远不会包含超过1000
连续\
字符,但它似乎是矫枉过正。
国际海事组织更好的解决方案将搜索想要找到的字符串,而不是搜索想要分裂的字符串。你想找到字符串
|
\
之前的所有字符(包括|
因为\
就干脆逃跑吧)。所以我们的正则表达式可能看起来像(\\\\.|[^|])+
(我放在\\\\.
在启动防止[^|]
消费\
将被用来逃避其他字符)。
例子:
Pattern p = Pattern.compile("(\\\\.|[^|])+");
Matcher m = p.matcher(text);
while (m.find()){
System.out.println(m.group());
}
输出:
abc
foo\|c:\\bar\\
cde
什么是你的分裂状态?在它之前的“|”里面是否包含“'''”的括号或'|'?你的字符串也可以是'abc \ | abc | (ab | ab)'?甚至是'ab \\ | ab \ | ab'?如果是的话,你会如何分裂它? – Pshemo
看起来像你只需要通过|分割字符。如果这是你想要的,你可以使用String [] splitedArray = str.split(“\\ |”); –
@RamanShrivastava事情并不那么简单。另外OP已经在'\\ |'上分裂了。 – Pshemo