如何检测不带空格的字符串中的关键字?
How to detect keyword in String without spaces?
基本上我想要的结果是根据已知关键字拆分字符串,而不管空格是否分隔关键字。下面是我当前实现的示例,期望 param String line = "sum:=5;":
private static String[] nextLineAsToken(String line) {
return line.split("\s+(?=(:=|<|>|=))");
}
预期:
String[] {"sum", ":=", "5;"};
实际:
String[] {"sum:=5;"};
我觉得这不可能,但很高兴收到你们的来信。
谢谢
您的主要问题是您编码了 \s+
而不是 \s*
, 要求 有空格可以分割,而不是空格是可选的。另一个问题是你的正则表达式只拆分 before operators.
使用这个正则表达式:
\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*
或Java:
return line.split("\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*");
它使用 ahead 来拆分 before 运算符,并使用 behind 来拆分在 运算符之后。
已添加 \s*
以消耗术语之间的所有空格。
还要注意 (?<!:)
内 前瞻中的负面观察,以防止在 :
和 =
之间分裂。
这是一个示例代码,您可以使用它来将您的输入分成几组。像常规 space 这样的白色 space 字符将被忽略。它稍后被打印到 for 循环的输出中:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(\w*)\s*(:=)\s*(\d*;)";
final String string = "sum:=5;";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
这是输出:
Full match: sum:=5;
Group 1: sum
Group 2: :=
Group 3: 5;
基本上我想要的结果是根据已知关键字拆分字符串,而不管空格是否分隔关键字。下面是我当前实现的示例,期望 param String line = "sum:=5;":
private static String[] nextLineAsToken(String line) {
return line.split("\s+(?=(:=|<|>|=))");
}
预期:
String[] {"sum", ":=", "5;"};
实际:
String[] {"sum:=5;"};
我觉得这不可能,但很高兴收到你们的来信。 谢谢
您的主要问题是您编码了 \s+
而不是 \s*
, 要求 有空格可以分割,而不是空格是可选的。另一个问题是你的正则表达式只拆分 before operators.
使用这个正则表达式:
\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*
或Java:
return line.split("\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*");
它使用 ahead 来拆分 before 运算符,并使用 behind 来拆分在 运算符之后。
已添加\s*
以消耗术语之间的所有空格。
还要注意 (?<!:)
内 前瞻中的负面观察,以防止在 :
和 =
之间分裂。
这是一个示例代码,您可以使用它来将您的输入分成几组。像常规 space 这样的白色 space 字符将被忽略。它稍后被打印到 for 循环的输出中:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(\w*)\s*(:=)\s*(\d*;)";
final String string = "sum:=5;";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
这是输出:
Full match: sum:=5;
Group 1: sum
Group 2: :=
Group 3: 5;