使用正则表达式检查字符串开头是否与模式匹配

时间:2018-07-23 02:11:52

标签: java regex

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

有效行以-2到2(含)之间的数字开头,然后是单个空格,然后是可能的文本。

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

我想为此使用正则表达式,但无法使其正常工作。我对正则表达式不熟悉。这是我的代码:

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 个答案:

答案 0 :(得分:2)

您可能正在寻找类似于以下内容的正则表达式:

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

^符号匹配行的开头,(0|...)匹配0或以下表达式,-?匹配0或1次出现的{{1} },-匹配1或2,[1-2]匹配空白,而匹配0或除换行符以外的其他任何内容。

答案 1 :(得分:0)

如果我没弄错您的问题,那么您将需要以下内容作为您的模式:

-?[0-2] \ s [\ w \ d \ s] *

尝试RegExr,它是一个非常好的基于Web的工具,用于确定正则表达式模式。

答案 2 :(得分:0)

如果测试字符串逐行分隔,则可以逐行验证测试字符串

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作为第一个字符