我有一个包含数千条记录的文件,我需要根据每行的第8个字符对它们进行过滤。在我的例子中,如果第8个字符是[a或A],我想提取该行并保存到新文件。
我刚刚整理了一个简单的java应用程序,其中包含3个项目2,其中包含我想要的数据" 1st和3rd",我打印到控制台,但我的匹配器不起作用。
我的代码示例:
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);
}
}
}
}
输出:
^.{7}([aA]{1}) -> CARHALAALondon GB United Kingdom W
^.{7}([aA]{1}) -> T(U LRFonhai CN China E
^.{7}([aA]{1}) -> A$F LAMuguni VE Venezuela E
正如你所看到的那样,只打印出第一个SYSO,任何人都知道如何实现我想要做的事情。
由于
答案 0 :(得分:2)
你快到了 - Matcher::matches
attempts to match the whole string。
这种模式可以做你想要的:
String pattern = "^.{7}[aA].*";
或者(更简单,更有效):
for (String ssn : input) {
char eighth = ssn.charAt(7);
if (eighth == 'a' || eighth == 'A') {
System.out.println("Match: " + ssn);
}
}
答案 1 :(得分:2)
我会抛弃正则表达式的东西,然后使用String&#39的charAt(int)方法进行检查,因为我已经在下面的第八个CharIsACharAt方法中完成了:
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");
}
}
正则表达式很棒,但在循环中使用时效率不高。在你的具体情况下,它似乎有点矫枉过正。
在使用charAt与Pattern匹配的测试比较中,charAt获胜超过10倍。
运行输出:
Matcher elapsed time: 64 ms
charAt elapsed time: 4 ms