【问题标题】:Split words from string into array but not if they are inbetween slashes将字符串中的单词拆分为数组,但如果它们在斜杠之间则不拆分
【发布时间】:2014-03-23 13:39:02
【问题描述】:

我有这个代码:

String path; 
path = main.getInput(); // lets say getInput() is "Hello \Wo rld\"
args = path.split("\\s+");

for (int i = 0; i < args.length; i++) {
     System.out.println(args[i]);
}

有没有办法拆分字符串,以便将单词拆分并放入数组中,但前提是它们 not 在两个反斜杠之间,这样“Wo rld”将是一个一个字而不是两个?

【问题讨论】:

  • 我的策略是先用反斜杠分割,然后用空格分割偶数索引(0、2、4...),然后将结果收集到一个数组中。跨度>
  • 反斜杠之间会不会有多个空格,比如`\Wo r l d`?
  • @donfuxx 是的。如您所见,“Wo”和“rld”之间有一个空格。
  • 我的意思是:可以有多个空格吗,比如World

标签: java regex string split


【解决方案1】:

您可以尝试仅对后跟偶数个反斜杠的空格进行拆分。原始正则表达式:

\s+(?=(?:[^\\]*\\[^\\]*\\)*[^\\]*$)

Java 转义正则表达式:

\\s+(?=(?:[^\\\\]*\\\\[^\\\\]*\\\\)*[^\\\\]*$)

ideone demo

【讨论】:

  • 您的正则表达式因输入 Hello \\Wo rld\\ our world \\test now java escaped \\ used 而中断。
  • 这行得通,除了问题是我直接从 JTextField 中获取我的字符串,这意味着我的字符串总是会有一个斜线,所以 \\Wo rld\\ 对我来说实际上是 \Wo rld\
  • @AdamMiszczak 我不确定我是否看到了问题:s
  • @Jerry 说我有一个字符串变量,我不能有它“\Wo rld\”,我需要转义反斜杠,所以它变成了“\\Wo rld\\”。但是,因为我将字符串变量设置为等于 textField.getText(),所以字符串实际上是“\Wo rld\”,如果这听起来不清楚,我们深表歉意。因此,上面的方法对我不起作用,输出仍然是三个不同的单词。
  • @AdamMiszczak 但是当您执行System.out.println(textField.getText()) 时会打印什么?你看到“\Wo rld\”对吗?如果是这样,正则表达式应该可以正常工作。
【解决方案2】:

试试这个:

String s = "John Hello \\Wo rld\\ our world";
Pattern pattern = Pattern.compile("(\\\\.*?\\\\)|(\\S+)");
Matcher m = pattern.matcher(s);
while (m.find( )) {
    if(m.group(1) != null){
        System.out.println(m.group(1));
    }
    else{
        System.out.println(m.group(2));
    }
}

输出:

John
Hello
\Wo rld\
our
world

【讨论】:

    【解决方案3】:

    如果它不必是正则表达式,那么您可以使用这个简单的解析器并在 一次迭代 中获得结果。

    public static List<String> spaceSplit(String str) {
        List<String> tokens = new ArrayList<>();
    
        StringBuilder sb = new StringBuilder();
        boolean insideEscaped = false; //flag to check if I can split on space 
    
        for (char ch : str.toCharArray()) {
    
            if (ch == '\\') 
                insideEscaped = !insideEscaped;
    
            // we need to split only on spaces which are not in "escaped" area
            if (ch == ' ' && !insideEscaped) {
                if (sb.length() > 0) {
                    tokens.add(sb.toString());
                    sb.delete(0, sb.length());
                }
            } else //and add characters that are not spaces from between \
                sb.append(ch);
        }
        if (sb.length() > 0)
            tokens.add(sb.toString());
    
        return tokens;
    }
    

    用法:

    for (String s : spaceSplit("hello \\wo rld\\"))
        System.out.println(s);
    

    输出:

    hello
    \wo rld\
    

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多