Salesforce - Apex Class / Trigger, чтобы не допускать трех последовательных символов [дублировать]

Мой любимый способ прочитать небольшой файл - использовать 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
}

16
задан Dan Cruz 17 January 2012 в 15:45
поделиться

10 ответов

3 или более последовательных последовательных символа / числа ex-123, abc, 789, pqr и т. д.

Невозможно с регулярными выражениями.

3 или более последовательных идентичных символа / числа ex - 111, aaa, bbb. 222 и т. Д.

Используйте шаблон из (?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
3
ответ дан Dan Cruz 18 August 2018 в 20:29
поделиться
  • 1
    Ваш первый шаблон будет соответствовать символам, которые не являются последовательными (например, vbgt) – Toto 17 January 2012 в 15:49
  • 2
    Ой, оставил это. Исправлено. – Dan Cruz 17 January 2012 в 15:58
  • 3
    как проверить, имеет ли строка группу из трех или более похожих символов подряд (..... CCC ....), строка не должна содержать 3 последовательных похожих символа. например. он не должен принимать 1. AAA 2. AAAAAAA 3. AAAAR – srujan maddula 19 September 2014 в 10:05

Регулярное совпадение с тремя последовательными числами или алфавитами равно «([0-9] | [aA-zZ]) \ 1 \ 1"

2
ответ дан Gaurav Singh 18 August 2018 в 20:29
поделиться

для первого вопроса это работает, если вы в порядке с меньшим количеством регулярных выражений

         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
ответ дан Mathijs Segers 18 August 2018 в 20:29
поделиться
  • 1
    в этом есть регулярное выражение, – ShAkKiR 18 April 2018 в 05:13
  • 2
    Да, верно, я в какой-то момент отредактировал ответ. Я не получаю ни единого голоса, но это очень хорошо работает. это может быть не идеальным, но это неправильный ответ, который я предполагаю, и код довольно понятен. – Mathijs Segers 18 April 2018 в 05:25

Я не согласен, случай 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

http: / /regexr.com/3dqln

5
ответ дан ono2012 18 August 2018 в 20:29
поделиться

Насколько я знаю, первый случай действительно невозможен. Механизм регулярного выражения ничего не знает о порядке натуральных чисел или алфавита. Но, по крайней мере, можно различать 3 или более чисел и 3 или более букв, например:

[a-z]{3,}|[A-Z]{3,}|\d{3,}

Это соответствует abcd, ABCDE или 123, но не соответствует ab2d, A5c4 или 12z, например. В соответствии с этим второй случай может быть правильно задан в более короткой версии:

  (\w)\1{2,}
5
ответ дан pemistahl 18 August 2018 в 20:29
поделиться
  • 1
    \w включает также подчеркивание _ – Toto 17 January 2012 в 14:38
  • 2
    Конечно, но автор явно не исключал пунктуации. Она упоминала только идентичные символы . Это может быть практически все. Но в любом случае... – pemistahl 17 January 2012 в 15:38

Если у вас есть нижняя граница (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
1
ответ дан Prashant Bhate 18 August 2018 в 20:29
поделиться

Я не думаю, что вы можете использовать регулярное выражение для первого случая. Второй случай легко:

Pattern pattern = Pattern.compile("([a-z\\d])\\1\\1", Pattern.CASE_INSENSITIVE);

Поскольку \\1 представляет часть, согласованную с группой 1, это будет соответствовать любой последовательности из трех одинаковых символов, которые находятся либо в пределах диапазона a-z, либо являются цифрами (\d).

16
ответ дан Pshemo 18 August 2018 в 20:29
поделиться
  • 1
    stackoverflow.com/questions/22931991/… отметили, что действительно возможно сопоставить произвольную длину последовательных символов в строке, если вы определяете правила, для которых следуют символы. – mbomb007 18 December 2014 в 16:44

Спасибо всем за помощь.

Для первого случая - 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;
}
2
ответ дан sandy0093 18 August 2018 в 20:29
поделиться
  • 1
    искусство состоит в том, чтобы писать меньше кода. в этом случае вам нужно найти правильное регулярное выражение. – DragonKnight 11 November 2016 в 21:46

Попробуйте это для первого вопроса.

возвращает 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'));
-1
ответ дан ShAkKiR 18 August 2018 в 20:29
поделиться

для второго вопроса:

\\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
7
ответ дан Toto 18 August 2018 в 20:29
поделиться
  • 1
    Однако эта первая часть не является последовательной. – AHungerArtist 16 January 2012 в 17:14
  • 2
    @AHungerArtist: Да, вы правы, я неправильно понял вопрос. – Toto 16 January 2012 в 17:19
  • 3
    Почему вы используете границы слов? Я не вижу вопроса о том, что мы ищем поиск слов – Milad Naseri 16 January 2012 в 20:04
  • 4
    @MiladNaseri, чтобы избежать сопоставления aaaaaaab. – mathematical.coffee 17 January 2012 в 01:57
  • 5
    как мы можем преобразовать его в менее чем 3? – Saksham 3 September 2015 в 18:39
Другие вопросы по тегам:

Похожие вопросы: