gpt4 book ai didi

java - 引号内引号的命令解析

转载 作者:行者123 更新时间:2023-12-01 12:31:33 26 4
gpt4 key购买 nike

我尝试用Java中的正则表达式解析命令有一段时间了,但没有成功。我遇到的主要问题是分隔符是空格,然后我想将双引号内的所有内容视为参数,但如果这些参数之一包含引号内的引号怎么办?这是命令和一些示例:

my_command "regex or text" <"regex or text"|NA> <"text or regex"|NA> integer integer 

Example1: my_command "Simple case" NA NA 2 3

Example2: my_command "This is it!" "[\",;']" "Really?" 3 5

Example3: my_command "Not so fast" NA "Another regex int the mix [\"a-zA-Z123]" 1 1

基本上 parseCommand(String str) 将采用上述任何示例并返回具有以下值的列表:

Example1: list[0] = "Simple Case", list[1] = NA, list[2] = NA, list[3] = "2", list[4] = "3"

Example2: list[0] = "This is it!", list[1] = "[\",;']", list[2] = NA, list[3] = "3", list[4] = "5"
Example3: list[0] = "Not so fast", list[1] = NA, list[2] = "Another regex int the mix [\"a-zA-Z123]" , list[3] = "1", list[4] = "1"

感谢您提前提供的帮助。

最佳答案

尝试使用正则表达式执行此操作是一个错误 - 您没有解析 regular expression .

从这样的事情开始 - 你会 fail使用正则表达式:

public void test() {
System.out.println(parse("\"This is it!\" \"[\\\",;']\" \"Really?\" 3 5"));
}

List<String> parse(String s) {
List<String> parsed = new ArrayList<String>();
boolean inQuotes = false;
boolean escape = false;
int from = 0;
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
switch (ch) {
case ' ':
if (!inQuotes && !escape) {
parsed.add(s.substring(from, i));
from = i + 1;
}
break;
case '\"':
if (!escape) {
inQuotes = !inQuotes;
}
escape = false;
break;
case '\\':
escape = !escape;
break;
default:
escape = false;
break;
}
}

if (from < s.length()) {
parsed.add(s.substring(from, s.length()));
}
return parsed;
}

已添加

对于有问题的特定字符串,这是我的解释:

String str = "my_command \"Something [\"abc']\" \"text\" NA 1 1";
// ............ .. .......
// ^ ^ ^ ^ ^

我使用了 ^ 来表示引号,并使用 . 来表示引号中的所有字符。因此,在第一个引号之后不会再进行拆分,因为之后没有未加引号的空格。

关于java - 引号内引号的命令解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com