代码之家  ›  专栏  ›  技术社区  ›  AlwaysNeedingHelp

使用regex检查字符串的开头是否与模式匹配

  •  0
  • AlwaysNeedingHelp  · 技术社区  · 7 年前

    我正在从.txt文件中读取行,我需要检查每一行是否“有效”。

    一个有效的行以一个介于-2和2之间(包括-2和2)的数字开始,然后后跟一个空白,然后可能是文本。

    • “-1这是有效的。”
    • “0这也是”
    • “-2和这个”
    • “2和这个”
    • “-1这不是。”
    • “-23也不是这个”

    我想用regex来做这个,但是很难让它工作我对regex很不熟悉。这是我的代码:

    public static List<Sentence> readFile(String filename) {
            List<Sentence> sentences = new LinkedList<>();
    
            Pattern pattern = Pattern.compile("-[0-2] abc");
            Matcher matcher;
            try (BufferedReader br = new BufferedReader(new FileReader(filename))) {
    
                while (br.ready()){
                    matcher = pattern.matcher(br.readLine());
                    if (matcher.matches()){
                        System.out.print("matches ");
                    }
                }
    
            } catch (IOException e){
                e.printStackTrace();
            }
    
            return sentences;
    
        }
    

    这不管用(没什么好惊讶的)。有人能帮我找到正确的正则表达式吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Dillon Davis    7 年前

    您可能正在寻找类似于以下内容的regex:

    ^(0|-?[1-2]) .*
    

    这个 ^ 符号与一行的开头匹配, (0|...) 比赛 0 或者下面的表达式 -? 匹配0或1个匹配项 - 我是说, [1-2] 匹配1或2, 匹配空白,并且 .* 匹配除换行符以外的0个或更多项。

        2
  •  0
  •   jackielpy    7 年前

    如果我没有弄错你的问题,你需要这样的模式:

    -是吗?[0-2]\s[\w\d\s].*

    试试RegExr,它是一个非常好的基于web的工具,用于计算regex模式。

        3
  •  0
  •   SKLTFZ    7 年前

    如果测试字符串是逐行分隔的,那么您可以逐行验证测试字符串

    foreach (string line in lines)
    {
        match = Regex.Match(line, @"^(-?[1-2]\s.*|0\s.*)", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            MessageBox.Show(match.Groups[1].Value);
        }
    }
    

    它验证测试字符串,并捕获有效字符串。

    如前所述,它只在测试字符串被行分隔时工作。

    修改正则表达式以满足由“\n”分隔的完整字符串

    应该是

    string regExp = @"(-?[1-2]\s.+[\n]{1}|(?<!-)0\s.+[\n]{1})";
    MatchCollection matches = Regex.Matches(longstr, regExp, RegexOptions.IgnoreCase);
    foreach(Match match in matches)
    {
        if (match.Success)
        {
            MessageBox.Show(match.Groups[1].Value);
        }
    }
    

    关于完整字符串的问题是,您不能再应用 ^ & 在表达式中。

    将发生负匹配并捕获子字符串“ 0 is not valid “从” -0 is not valid “如果 ^ 从表达式中移除

    因此 (?<!-) 它必须忽略 - 当下列字符为 0