Java正则表达式检查行的第8个字符是否为

Java正则表达式检查行的第8个字符是否为,java,regex,Java,Regex,我有一个包含数千条记录的文件,我需要根据每行的第8个字符对它们进行过滤。在我的例子中,如果第8个字符是[a或a],我希望提取该行并保存到新文件中 我刚刚组装了一个简单的java应用程序,其中3个项目2包含我想要的第一个和第三个数据,我正在打印到控制台,但我的matcher无法工作 我的代码示例: import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.r

我有一个包含数千条记录的文件,我需要根据每行的第8个字符对它们进行过滤。在我的例子中,如果第8个字符是[a或a],我希望提取该行并保存到新文件中

我刚刚组装了一个简单的java应用程序,其中3个项目2包含我想要的第一个和第三个数据,我正在打印到控制台,但我的matcher无法工作

我的代码示例:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidateDemo {
   public static void main(String[] args) {
      String pattern = "^.{7}([aA]{1})";

      // Create a Pattern object
      Pattern p = Pattern.compile(pattern);

      List<String> input = new ArrayList<String>();
      input.add("CARHALAALondon                     GB                         W");
      input.add("T(U   LRFonhai                     CN                         E");
      input.add("A$F   LAMuguni                     VE                         E");

      for (String ssn : input) {
         System.out.println(p + " -> " +ssn);
         if (p.matcher(ssn).matches()){
            System.out.println("Match: " + ssn);
         }

      }
  }
}
正如您所看到的,它只打印出第一个系统,任何人都不知道如何实现我正在尝试的目标

谢谢

你就快到了

此模式应满足您的要求:

String pattern = "^.{7}[aA].*";
或者更简单、更高效:

for (String ssn : input) {
   char eighth = ssn.charAt(7);
   if (eighth == 'a' || eighth == 'A') {
      System.out.println("Match: " + ssn);
   }
}    
你就快到了

此模式应满足您的要求:

String pattern = "^.{7}[aA].*";
或者更简单、更高效:

for (String ssn : input) {
   char eighth = ssn.charAt(7);
   if (eighth == 'a' || eighth == 'A') {
      System.out.println("Match: " + ssn);
   }
}    

我会放弃正则表达式的内容,只使用String的charAtint方法进行检查,就像我在下面的第八个CharisCharat方法中所做的那样:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class ValidateDemo {
    private static boolean eighthCharIsACharAt(String s) {
        char eighthChar = s.charAt(7);
        return (eighthChar == 'a' || eighthChar == 'A');
    }

    private static boolean eighthCharIsAMatcher(String s, Pattern p) {
        return p.matcher(s).matches();
    }

    public static void main(String[] args) {
        String pattern = "^.{7}[aA].*";
        Pattern p = Pattern.compile(pattern);

        List<String> input = new ArrayList<String>();
        input.add("CARHALAALondon                     GB                         W");
        input.add("T(U   LRFonhai                     CN                         E");
        input.add("A$F   LAMuguni                     VE                         E");

        int numIterations = 10000;

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < numIterations; i++) {
            for (String s: input) {
                if (eighthCharIsAMatcher(s, p)) {
                    //System.out.println(s);
                }
            }
        }

        System.out.println("Matcher elapsed time: " + (System.currentTimeMillis() - startTime) + " ms");

        startTime = System.currentTimeMillis();

        for (int i = 0; i < numIterations; i++) {
            for (String s: input) {
                if (eighthCharIsACharAt(s)) {
                    //System.out.println(s);
                }
            }
        }

        System.out.println("charAt elapsed time: " + (System.currentTimeMillis() - startTime) + " ms");
    }
}

我会放弃正则表达式的内容,只使用String的charAtint方法进行检查,就像我在下面的第八个CharisCharat方法中所做的那样:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class ValidateDemo {
    private static boolean eighthCharIsACharAt(String s) {
        char eighthChar = s.charAt(7);
        return (eighthChar == 'a' || eighthChar == 'A');
    }

    private static boolean eighthCharIsAMatcher(String s, Pattern p) {
        return p.matcher(s).matches();
    }

    public static void main(String[] args) {
        String pattern = "^.{7}[aA].*";
        Pattern p = Pattern.compile(pattern);

        List<String> input = new ArrayList<String>();
        input.add("CARHALAALondon                     GB                         W");
        input.add("T(U   LRFonhai                     CN                         E");
        input.add("A$F   LAMuguni                     VE                         E");

        int numIterations = 10000;

        long startTime = System.currentTimeMillis();

        for (int i = 0; i < numIterations; i++) {
            for (String s: input) {
                if (eighthCharIsAMatcher(s, p)) {
                    //System.out.println(s);
                }
            }
        }

        System.out.println("Matcher elapsed time: " + (System.currentTimeMillis() - startTime) + " ms");

        startTime = System.currentTimeMillis();

        for (int i = 0; i < numIterations; i++) {
            for (String s: input) {
                if (eighthCharIsACharAt(s)) {
                    //System.out.println(s);
                }
            }
        }

        System.out.println("charAt elapsed time: " + (System.currentTimeMillis() - startTime) + " ms");
    }
}

你为什么要用正则表达式呢?只需获取第8个字符,并将其与a进行比较&a为什么要使用正则表达式?只需获得第8个字符,并将其与a&AThanks进行比较,即可快速响应,效果100%。这是我应该做的正确方法吗?不需要在集合后加上量词{1},也没有任何理由将它们放在捕获组括号中,除非您需要捕获字母以确定它是小写还是大写。我会选择charAt,因为它简单多了。@DavidConrad是的,的确如此-我只是复制粘贴,没有真正检查内容-修改。感谢快速响应,100%有效。这是我应该做的正确方法吗?不需要在集合后加上量词{1},也没有任何理由将它们放在捕获组括号中,除非您需要捕获字母以确定它是小写还是大写。我会选择charAt,因为它简单得多。@DavidConrad是的,的确如此-我只是复制粘贴,没有真正检查内容-修改。我使用regEx的原因是我认为它会更快。我需要处理文件A中的20000多行,如果匹配,请将该行复制到文件B,然后保存到其他位置。仅仅使用charAt7可以吗?使用我提供的方法比使用正则表达式快得多。我使用正则表达式的原因是我认为它会更快。我需要处理文件A中的20000多行,如果匹配,请将该行复制到文件B,然后保存到其他位置。使用charAt7行吗?使用我提供的方法比使用正则表达式快得多。