【问题标题】:Java Split on Spaces and Special CharactersJava拆分空格和特殊字符
【发布时间】:2014-01-30 00:41:20
【问题描述】:

我正在尝试将字符串拆分为空格和一些特定的特殊字符。

给定字符串“john - & + $ ? . @boy” 我要获取数组:

array[0]="john";
array[1]="boy";

我已经尝试了几个正则表达式,但没有得到任何结果。这是我目前的刺伤:

String[] terms = uglString.split("\\s+|[\\-\\+\\$\\?\\.@&].*");

保留“john”但不保留“boy”。谁能帮我把剩下的给我?

【问题讨论】:

标签: java regex split


【解决方案1】:

只需使用:

String[] terms = input.split("[\\s@&.?$+-]+");

您可以将速记字符类放在字符类中(注意\s),并且大多数元字符在字符类中都失去了意义,除了[]-&\。但是,& 仅在 && 成对出现时才有意义,如果将 - 放在字符类的开头或结尾,则将其视为文字字符。

其他语言可能有不同的模式解析规则,但- 的规则适用于大多数引擎。

正如@Sean Patrick Floyd 在他的回答中提到的,重要的事情归结为定义一个词的构成。 Java 中的\w 等价于[a-zA-Z0-9_](英文字母大小写、数字和下划线),因此\W 由所有其他字符组成。如果您想考虑 Unicode 字母和数字,您可能需要查看 Unicode character classes

【讨论】:

    【解决方案2】:

    您可以通过将您的模式替换为 "\\W+"(出现一次或多次非单词字符。(这样您将字符列入白名单而不是列入黑名单,这通常是个好主意)来简化您的代码

    p>

    当然,使用Guava's Splitter class 可以提高效率

    【讨论】:

      【解决方案3】:

      试试这个.....

      Input.replace("-&+$?.@"," ").split(" ");
      

      【讨论】:

        【解决方案4】:

        然后一步一步打破:

        对于您的情况,您替换非单词字符(如所指出的)。现在您可能希望保留空格以方便字符串拆分。

        String ugly = "john - & + $ ? . @ boy";
        String words = ugly.replaceAll("[^\\w\\s]", "");
        

        生成的字符串中有很多空格,您可能希望通常将其修剪为仅 1 个空格:

        String formatted = words.trim().replaceAll(" +", " ");
        

        现在您可以轻松地将字符串拆分为字符串数组:

        String[] terms = formatted.split("\\s");
        System.out.println(terms[0]);
        

        【讨论】:

          【解决方案5】:

          要补充关于Splitter 的内容,您可以执行以下操作:

              String str = "john - & + $ ? . @ boy";
              Iterable<String> ttt = Splitter.on(Pattern.compile("\\W")).trimResults().omitEmptyStrings().split(str);
          

          【讨论】:

          • \s\W 等价于\W。单词字符类不包含空格,所以非单词字符类包含空格。
          【解决方案6】:

          你可以使用类似下面的东西

          arrayOfStringType=string.split(" |'|,|.|//+|_");
          

          '|'将在这里作为或操作员工作。

          【讨论】:

            【解决方案7】:

            使用这种格式。

            String s = "john - & + $ ? . @ boy";
            String reg = "[!_.',@? ]";
            String[] res = s.split(reg);
            

            这里包括你想在[ ]括号内分割的每个字符。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多