Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将表达式字符串拆分为ArrayList_Java_String_Split - Fatal编程技术网

Java 将表达式字符串拆分为ArrayList

Java 将表达式字符串拆分为ArrayList,java,string,split,Java,String,Split,我有一个表达式字符串作为 "((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen)))"; 是否有任何内置函数可以将它们拆分为列表具有以下格式: list[0] = "("; list[1] = "("; list[2] = "firstname"; list[3] = "="; list[

我有一个表达式字符串作为

"((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen)))";
是否有任何内置函数可以将它们拆分为
列表
具有以下格式:

list[0] = "(";
list[1] = "(";
list[2] = "firstname";
list[3] = "=";
list[4] = "john"
list[5] = "AND";
list[6] = "Lastname"
list[7] = "=";
list[8] = "Eleven";
list[9] = ")"
list[10] = "OR"
list[11] = "(";
list[12] = "salary";
list[13] = "15000"
list[14] = "AND"
etc...

只需对多个delimeters使用
split

String[] tokens = exp.split("\\(|\\)| |=");

只需对多个delimeters使用
split

String[] tokens = exp.split("\\(|\\)| |=");
在“
”之间指定空格,如下所示:

String exp = "( ( firstname = john AND Lastname = Eleven ) OR ( salary = 15000 AND location = Mexico OR ( firstname = mathew AND lastname = Thirteen ) ) )";
现在您可以使用
exp.split(“”;

在“
”之间指定空格,如下所示:

String exp = "( ( firstname = john AND Lastname = Eleven ) OR ( salary = 15000 AND location = Mexico OR ( firstname = mathew AND lastname = Thirteen ) ) )";
现在,您可以使用
exp.split(“”)进行拆分;

您可以使用
空格$1空格替换所有
空间,然后使用空格进行拆分:

String spl[] = 
       str.replaceAll("([\\(\\)=])", " $1 ").replaceAll(" +", " ").trim().split("\\s");
输出

(, (, firstname, =, john, AND, Lastname, =, Eleven, ), OR, (, salary, =, 15000, AND, 
location, =, Mexico, OR, (, firstname, =, mathew, AND, lastname, =, Thirteen, ), ), )
您可以用
空格$1空格替换所有
WO,然后用空格拆分:

String spl[] = 
       str.replaceAll("([\\(\\)=])", " $1 ").replaceAll(" +", " ").trim().split("\\s");
输出

(, (, firstname, =, john, AND, Lastname, =, Eleven, ), OR, (, salary, =, 15000, AND, 
location, =, Mexico, OR, (, firstname, =, mathew, AND, lastname, =, Thirteen, ), ), )

通常,此过程称为:

在计算机科学中,词法分析是将字符序列(如在计算机程序或网页中)转换为标记序列(具有指定意义的字符串)的过程

这可以通过定义一个:

词法语法是定义标记语法的形式语法

(, (, firstname, =, john, AND, Lastname, =, Eleven, ), OR, (, salary, =, 15000, AND, 
location, =, Mexico, OR, (, firstname, =, mathew, AND, lastname, =, Thirteen, ), ), )
一旦定义了词法语法,就可以使用JavaCC或JFlex等工具在词法器中转换该语法,这基本上是一个软件,它将字符序列作为输入,并生成一个标记列表作为输出

请注意,词法分析器不仅在字符串序列中拆分原始字符序列,而且在更具体的标记序列中拆分,例如:

OPEN_PARANTHESIS
OPEN_PARANTHESIS
NAME with value firstname
OPERATOR with value =
NAME with value john
OPERATOR with value AND
NAME with value Lastname
OPERATOR with value =
...

因此,它所做的事情比你所问的要多,但你的问题似乎与它非常相关。

通常,这个过程被称为:

在计算机科学中,词法分析是将字符序列(如在计算机程序或网页中)转换为标记序列(具有指定意义的字符串)的过程

这可以通过定义一个:

词法语法是定义标记语法的形式语法

(, (, firstname, =, john, AND, Lastname, =, Eleven, ), OR, (, salary, =, 15000, AND, 
location, =, Mexico, OR, (, firstname, =, mathew, AND, lastname, =, Thirteen, ), ), )
一旦定义词汇语法,就可以使用诸如JavaCC或JFlex这样的工具,它们在lexer中转换语法,这基本上是一个软件,它将作为输入一系列字符并生成一个标记列表

请注意,词法分析器不仅在字符串序列中拆分原始字符序列,而且在更具体的标记序列中拆分,例如:

OPEN_PARANTHESIS
OPEN_PARANTHESIS
NAME with value firstname
OPERATOR with value =
NAME with value john
OPERATOR with value AND
NAME with value Lastname
OPERATOR with value =
...

因此,它比您所问的做得更多,但您的问题似乎与它非常相关。

您可以使用
向前看
向后看
正则表达式
来获取令牌并对其进行迭代,例如:

String s = "((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen))";
for(String token : s.split("((?=(\\(|\\)|\\=|\\sAND\\s|\\sOR\\s))|(?<=(\\(|\\)|\\=|\\sAND\\s|\\sOR\\s)))")){
    System.out.println(token.trim());
}
String s=“((firstname=john,Lastname=11)或(salary=15000,location=Mexico或(firstname=mathew,Lastname=13))”;

对于(字符串标记:s.split((((?=(\\(\\\\)\\\=\\\\sAND\\s\\\\\sOR\\s))。(?您可以使用
lookahead
lookahead
regex
获取标记并对其进行迭代,例如:

String s = "((firstname = john AND Lastname = Eleven) OR (salary = 15000 AND location = Mexico OR (firstname = mathew AND lastname = Thirteen))";
for(String token : s.split("((?=(\\(|\\)|\\=|\\sAND\\s|\\sOR\\s))|(?<=(\\(|\\)|\\=|\\sAND\\s|\\sOR\\s)))")){
    System.out.println(token.trim());
}
String s=“((firstname=john,Lastname=11)或(salary=15000,location=Mexico或(firstname=mathew,Lastname=13))”;


对于(字符串标记:s.split((((?=(\\(\\\\)\\=\\\\\sAND\\s\\\\\sOR\\s)))(您是否尝试过使用正则表达式?请尝试
String.split
我建议您阅读此有关split(regex)的turorial问题,我无法获取用于split的运算符。例如,如果我使用(或)进行split,我将无法获取(在结果列表中,您是否尝试过使用正则表达式?try
string.split
我建议您阅读这个有关split(正则表达式)的问题,我无法获取用于split的运算符。例如,如果我使用(或)进行split,我将无法获取(在结果列表中,您不应该仅仅为了按照编码标准使用
split
函数而更改表达式本身任何表达式都应该有空格b/w花括号扫描您显示的工作代码将空格放在正确的位置?这几乎是一个等价的问题,因此您在这里没有提供太多答案。您不应该仅仅为了使用符合编码标准的
split
函数而更改表达式本身任何表达式都应该有空格b/w花括号扫描您显示的工作代码将空格放在正确的位置?这几乎是一个等价的问题,所以您在这里没有提供太多答案。这看起来很有希望只是edited为拆分(“\\s+”)。因此不需要第二次替换。我已经在编辑我的答案@CrazyProgrammer我现在犯了一个错误,它可以工作了fine@CrazyProgrammer您不必使用
\\s+
如果您检查是否可以获得
=,11),
这是不正确的,请像现在这样使用我的解决方案,它工作正常:)这看起来很有希望,只是编辑为拆分(\\s+)。因此不需要第二次替换。我已经编辑了我的答案@CrazyProgrammer我现在犯了一个错误,它可以工作了fine@CrazyProgrammer您不必使用
\\s+
如果您检查是否可以获得
=,11),
这是不正确的,请像现在这样使用我的解决方案,它工作正常:)这看起来很有趣,也是最好的实现方式。如果你能帮我举一些例子,我会尝试使用它们。这看起来很有趣,也是最好的实现方式。如果你能帮我举一些例子,我会尝试使用它们