繁体   English   中英

在Java中解析转义空间

[英]Parsing escaped space in java

我需要模仿终端的操作。 例如,如果我有

  • 我想获取"a quoted string" anotherParam ["a quoted string", "anotherParam"]
  • test\\ folder somethingElse应该变成["test folder", somethingElse]

我该怎么做? 我一直在尝试正则表达式,但似乎无法正确处理……主要问题是区分空格,指示下一个参数和应该成为同一参数的转义空格

顺便说一句,我不能只使用Java提供的类的库

当前代码使用

[^\s]+

因此,它考虑的不是空格而不是令牌的任何东西,是否可以包含转义的空格? 也许有更好的解决方法?

除非找到更好的东西,否则我现在成功采用的一种可能性是通过用实际上不太可能出现的东西替换转义的空格来预处理输入:$p@c3:然后在所有正则表达式填充/标记化之后,我将字符串替换为空间。 到目前为止效果很好

我认为您可以使用此正则表达式查找参数:

"(((?!").)+)"|(\S|(?<=\\)\s)+

给出了,一旦被转录为Java字符串:

"\"(((?!\").)+)\"|(\\S|(?<=\\\\)\\s)+"

它是这样工作的:

它匹配"(((?!").)+)"(\\S|(?<=\\\\)\\s)+

  1. "(((?!").)+)"匹配由"
  2. (\\S|(?<=\\\\)\\s)+匹配由以下内容组成的任何内容:
    2.1。 非空格字符\\S )或
    2.2。 空格字符\\s )是否已转义 (紧跟在\\之前)。

针对以下情况运行此正则表达式:

"a quoted string" anotherParam a\ third\ param

匹配三次:一次用于"a quoted string" ,一次用于anotherParam ,一次用于a\\ third\\ param


样本测试代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        final Pattern p = Pattern.compile("\"(((?!\").)+)\"|((\\S|(?<=\\\\)\\s)+)");
        final String input = "\"a quoted string\" anotherParam a\\ third\\ param";

        final Matcher m = p.matcher(input);
        while(m.find()) {
            if(m.group(1) == null) {
                System.out.println(m.group().replace("\\ ", " "));
            } else {
                System.out.println(m.group(1)); // trimmed from the surrounding quotes
            }
        }
    }
}

输出:

a quoted string
anotherParam
a third param

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM