Мой любимый способ прочитать небольшой файл - использовать BufferedReader и StringBuilder. Это очень просто и точно (хотя и не особенно эффективно, но достаточно для большинства случаев):
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Некоторые отметили, что после Java 7 вы должны использовать try-with-
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
Когда я читаю строки, подобные этому, я обычно хочу выполнять некоторую обработку строк для каждой строки, поэтому я перехожу к этой реализации. (т. е. автоматическое закрытие):
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
/ g5]
Хотя если я хочу просто прочитать файл в String, я всегда использую Apache Commons IO с помощью метода класса IOUtils.toString (). Вы можете посмотреть источник здесь:
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
И еще проще с Java 7:
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
3 или более последовательных последовательных символа / числа ex-123, abc, 789, pqr и т. д.
blockquote>Невозможно с регулярными выражениями.
3 или более последовательных идентичных символа / числа ex - 111, aaa, bbb. 222 и т. Д.
blockquote>Используйте шаблон из
(?i)(?:([a-z0-9])\\1{2,})*
.Если вы хотите проверить всю строку, используйте
Matcher.matches()
. Чтобы найти совпадения в строке, используйтеMatcher.find()
.Вот пример кода:
final String ps = "(?i)(?:([a-z0-9])\\1{2,})*"; final String psLong = "(?i)\t\t\t# Case insensitive flag\n" + "(?:\t\t\t\t# Begin non-capturing group\n" + " (\t\t\t\t# Begin capturing group\n" + " [a-z0-9]\t\t# Match an alpha or digit character\n" + " )\t\t\t\t# End capturing group\n" + " \\1\t\t\t\t# Back-reference first capturing group\n" + " {2,}\t\t\t# Match previous atom 2 or more times\n" + ")\t\t\t\t# End non-capturing group\n" + "*\t\t\t\t# Match previous atom zero or more characters\n"; System.out.println("***** PATTERN *****\n" + ps + "\n" + psLong + "\n"); final Pattern p = Pattern.compile(ps); for (final String s : new String[] {"aa", "11", "aaa", "111", "aaaaaaaaa", "111111111", "aaa111bbb222ccc333", "aaaaaa111111bbb222"}) { final Matcher m = p.matcher(s); if (m.matches()) { System.out.println("Success: " + s); } else { System.out.println("Fail: " + s); } }
И вывод:
***** PATTERN ***** (?i)(?:([a-z0-9])\1{2,})* (?i) # Case insensitive flag (?: # Begin non-capturing group ( # Begin capturing group [a-z0-9] # Match an alpha or digit character ) # End capturing group \1 # Back-reference first capturing group {2,} # Match previous atom 2 or more times ) # End non-capturing group * # Match previous atom zero or more characters Fail: aa Fail: 11 Success: aaa Success: 111 Success: aaaaaaaaa Success: 111111111 Success: aaa111bbb222ccc333 Success: aaaaaa111111bbb222
Регулярное совпадение с тремя последовательными числами или алфавитами равно «([0-9] | [aA-zZ]) \ 1 \ 1"
для первого вопроса это работает, если вы в порядке с меньшим количеством регулярных выражений
containsConsecutiveCharacters(str) {
for (let i = 0; i <= str.length - 3; i++) {
var allthree = str[i] + str[i + 1] + str[i + 2];
let s1 = str.charCodeAt(i);
let s2 = str.charCodeAt(i + 1);
let s3 = str.charCodeAt(i + 2);
if (
/[a-zA-Z]+$/.test(allthree) &&
(s1 < s2 && s2 < s3 && s1+s2+s3-(3*s1) === 3)
) {
return true;
}
}
}
Я не согласен, случай 1 доступен для регулярного выражения, но вы должны сказать ему, что последовательности соответствуют ..., которые являются довольно длинными и скучными:
/(abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)+/ig
Насколько я знаю, первый случай действительно невозможен. Механизм регулярного выражения ничего не знает о порядке натуральных чисел или алфавита. Но, по крайней мере, можно различать 3 или более чисел и 3 или более букв, например:
[a-z]{3,}|[A-Z]{3,}|\d{3,}
Это соответствует abcd
, ABCDE
или 123
, но не соответствует ab2d
, A5c4
или 12z
, например. В соответствии с этим второй случай может быть правильно задан в более короткой версии:
(\w)\1{2,}
Если у вас есть нижняя граница (3) и верхняя граница regexString может быть сгенерирована следующим образом
public class RegexBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
int seqStart = 3;
int seqEnd = 5;
buildRegex(sb, seqStart, seqEnd);
System.out.println(sb);
}
private static void buildRegex(StringBuilder sb, int seqStart, int seqEnd) {
for (int i = seqStart; i <= seqEnd; i++) {
buildRegexCharGroup(sb, i, '0', '9');
buildRegexCharGroup(sb, i, 'A', 'Z');
buildRegexCharGroup(sb, i, 'a', 'z');
buildRegexRepeatedString(sb, i);
}
}
private static void buildRegexCharGroup(StringBuilder sb, int seqLength,
char start, char end) {
for (char c = start; c <= end - seqLength + 1; c++) {
char ch = c;
if (sb.length() > 0) {
sb.append('|');
}
for (int i = 0; i < seqLength; i++) {
sb.append(ch++);
}
}
}
private static void buildRegexRepeatedString(StringBuilder sb, int seqLength) {
sb.append('|');
sb.append("([a-zA-Z\\d])");
for (int i = 1; i < seqLength; i++) {
sb.append("\\1");
}
}
}
Выход
012|123|234|345|456|567|678|789|ABC|BCD|CDE|DEF|EFG|FGH|GHI|HIJ|IJK|JKL|KLM|LMN|MNO|NOP|OPQ|PQR|QRS|RST|STU|TUV|UVW|VWX|WXY|XYZ|abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|([a-z\d])\1\1|0123|1234|2345|3456|4567|5678|6789|ABCD|BCDE|CDEF|DEFG|EFGH|FGHI|GHIJ|HIJK|IJKL|JKLM|KLMN|LMNO|MNOP|NOPQ|OPQR|PQRS|QRST|RSTU|STUV|TUVW|UVWX|VWXY|WXYZ|abcd|bcde|cdef|defg|efgh|fghi|ghij|hijk|ijkl|jklm|klmn|lmno|mnop|nopq|opqr|pqrs|qrst|rstu|stuv|tuvw|uvwx|vwxy|wxyz|([a-z\d])\1\1\1|01234|12345|23456|34567|45678|56789|ABCDE|BCDEF|CDEFG|DEFGH|EFGHI|FGHIJ|GHIJK|HIJKL|IJKLM|JKLMN|KLMNO|LMNOP|MNOPQ|NOPQR|OPQRS|PQRST|QRSTU|RSTUV|STUVW|TUVWX|UVWXY|VWXYZ|abcde|bcdef|cdefg|defgh|efghi|fghij|ghijk|hijkl|ijklm|jklmn|klmno|lmnop|mnopq|nopqr|opqrs|pqrst|qrstu|rstuv|stuvw|tuvwx|uvwxy|vwxyz|([a-z\d])\1\1\1\1
Я не думаю, что вы можете использовать регулярное выражение для первого случая. Второй случай легко:
Pattern pattern = Pattern.compile("([a-z\\d])\\1\\1", Pattern.CASE_INSENSITIVE);
Поскольку \\1
представляет часть, согласованную с группой 1
, это будет соответствовать любой последовательности из трех одинаковых символов, которые находятся либо в пределах диапазона a-z
, либо являются цифрами (\d
).
Спасибо всем за помощь.
Для первого случая - 3 или более последовательных последовательных символа / числа; например 123, abc, 789, pqr и т. Д. Я использовал ниже логику кода. Поделитесь своими комментариями по этому поводу.
public static boolean validateConsecutiveSeq(String epin) {
char epinCharArray[] = epin.toCharArray();
int asciiCode = 0;
boolean isConSeq = false;
int previousAsciiCode = 0;
int numSeqcount = 0;
for (int i = 0; i < epinCharArray.length; i++) {
asciiCode = epinCharArray[i];
if ((previousAsciiCode + 1) == asciiCode) {
numSeqcount++;
if (numSeqcount >= 2) {
isConSeq = true;
break;
}
} else {
numSeqcount = 0;
}
previousAsciiCode = asciiCode;
}
return isConSeq;
}
Попробуйте это для первого вопроса.
возвращает true, если он находит 3 последовательных числа или алфавитов в arg
function check(value){
for (i = 0; i <= val.length - 3; i++) {
var s1 = val.charCodeAt(i);
var s2 = val.charCodeAt(i + 1);
var s3 = val.charCodeAt(i + 2);
if (Math.abs(s1 - s2) === 1 && s1 - s2 === s2 - s3) {
return true;
}
}
return false;
}
console.log(check('Sh1ak@ki1r@100'));
для второго вопроса:
\\b([a-zA-Z0-9])\\1\\1+\\b
пояснение:
\\b : zero-length word boundary
( : start capture group 1
[a-zA-Z0-9] : a letter or a digit
) : end group
\\1 : same character as group 1
\\1+ : same character as group 1 one or more times
\\b : zero-length word boundary
vbgt
) – Toto 17 January 2012 в 15:49