【问题标题】:Java String split with multicharacter delimiter使用多字符分隔符拆分 Java 字符串
【发布时间】:2012-09-04 16:42:03
【问题描述】:

我对 Java 还很陌生,我认为这与其他语言的工作方式相同。

对于字符串:

String line = "3::Daniel::Louis||##2::Leon: the Professional::1994||6::Jean::Reno||7::Gary::Oldman||8::Natalie::Portman||##3::Scarface::1983||9::Al::Pacino||10::Michelle::Pfeiffer";

我想在每个||## 处拆分它。

但是:

for(String s : line.split("||##")) {
    System.out.println("|"+s+"|");
 }

返回:

||
|3|
|:|
|:|
|D|
|a|
|n|
|i|

...等等

我期待:

3::Daniel::Louis

Leon: the Professional

...等等

我做错了什么?

【问题讨论】:

  • PS:Abel Ferrara 的“纽约之王”还是 Walter Hill 的“Streets of Fire”在名单中;)?
  • 哈哈哈,只是我从 imdb 的前 200 名中得到的随机东西

标签: java string split character


【解决方案1】:

你必须逃离 |字符,因为它是逻辑 OR 的正则表达式元字符

所以我会使用

line.split("\\|\\|##"))

请注意,您也必须转义斜线,这就是我使用的原因

\\|

而不是

\|

转义该元字符

【讨论】:

  • Nitpick:Java 本身是什么并不重要。但它也是正则表达式语法中的“或”,它们有自己的完全独立的语言。
【解决方案2】:

您需要转义条:| 是正则表达式中的特殊字符。

用途:

for(String s : line.split("\\|\\|##")) {

或者,您可以使用\Q\E 强制按字面意思使用整个模式:

for(String s : line.split("\\Q||##\\E")) {

这可能与您从Pattern.quote 获得的模式相同。

| 允许您在正则表达式中指定可选模式。您的正则表达式等同于 |##,或者:nothing OR ##。这会围绕空字符串进行拆分,或在输入中的每个字符之间拆分。

对于Pattern,请参阅javadoc

【讨论】:

    【解决方案3】:

    您应该转义您的 | 字符:

    for (String s : line.split("\\|\\|##"))
    

    【讨论】:

      【解决方案4】:

      你必须逃避'|'像这样\|

      【讨论】:

        【解决方案5】:

        听起来你想要这样的东西:

        Pattern p = Pattern.compile("\\|\\|##", Pattern.LITERAL)  
        String[] result = p.split(myString)  
        

        我知道您的分隔符中可以有多个字符,并且您可以从输出字符串中排除您的分隔符。

        知道上面的例子是否适合你的场景完全;您可能需要进行一些试验(例如,用“\”“转义”正则表达式“元字符”)。

        这是 Pattern.compile 的 Javadoc:

        这里有更多关于 Java 正则表达式语法的信息:

        【讨论】:

          【解决方案6】:
          public String[] split(String regex) 
          

          【讨论】:

          • 甜笨的我!你很好,是的,它与 Java 无关,而与 RegEx 无关。谢谢大家,但要感谢第一张有效的海报。
          【解决方案7】:

          Gilberto 的解决方案在这种情况下可以正常工作,但您可能需要查看 guava。它有很多非常有用的实用程序类,包括字符串拆分器。有了它你可以写:

          Iterable<String> frags = Splitter.on("||##").split(line);
          // Do whatever with the iterable...maybe you just want a list?
          // List<String> fragList = Lists.newArrayList(frags);
          

          【讨论】:

          • 我上个月将 Guava 用于 Android 应用程序,需要将大型数据库从捆绑包移动到数据文件夹,但除此之外,我对它还很陌生,根本没有看过它包含的功能。感谢您的建议
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-26
          • 1970-01-01
          • 2018-02-27
          • 2012-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多