【问题标题】:How to detect keyword in String without spaces?如何检测字符串中没有空格的关键字?
【发布时间】:2022-01-21 17:20:58
【问题描述】:

基本上,我想要的结果是根据已知关键字拆分字符串,而不管空格是否分隔关键字。下面是我当前实现的示例,期望参数 String line = "sum:=5;":

private static String[] nextLineAsToken(String line) {
    return line.split("\\s+(?=(:=|<|>|=))");
}

预期:

String[] {"sum", ":=", "5;"};

实际:

String[] {"sum:=5;"};

我觉得这是不可能的,但很高兴收到你们的来信。 谢谢。

【问题讨论】:

    标签: java arrays regex string split


    【解决方案1】:

    这是一个示例代码,您可以使用它来将您的输入分组。像常规空格这样的空白字符将被忽略。稍后在 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;
    

    【讨论】:

    • 哦,效果很好!
    • 如果我尝试向正则表达式添加其他元素,它会崩溃:"(\\w*)\\s*(:=)\\s*(!=)\\s* (\\d*;)" 我添加了一个 != 并且它停止工作,知道为什么会这样吗?
    • 对于:=!=,您需要or 条件,这里是您可以使用的正则表达式 - (\\w*)\\s*(:=|!=)\\s*(\\d*;)
    【解决方案2】:

    你的主要问题是你编码\s+而不是\s*,这要求有空格来分割,而不是空格是可选的。另一个问题是您的正则表达式仅拆分 before 运算符。

    使用这个正则表达式:

    \s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*
    

    live demo

    或作为 Java:

    return line.split("\\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\\s*");
    

    它使用 ahead 来拆分 before 运算符,并使用 behind 来拆分 after 运算符。

    已添加\s* 以使用术语之间的任何空格。

    还要注意(?&lt;!:) 背后的负面看法 向前看以防止:= 之间的分裂。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多