REGEX для совпадения числа цифр, равного алфавиту в строке - PullRequest
1 голос
/ 03 апреля 2019

Просто проверяем, можно ли использовать регулярное выражение для проверки / проверки строки буквенно-цифровой последовательности, чтобы убедиться, что она имеет одинаковое количество цифр и алфавита.

Например,

7868HGCD (4 digits, 4 alphabets)
87429AJIGH (5 digits, 5 alphabets)
8A2K9H7A (digits ,alphabets alternately)
1H2B3C7D9K8L

.. и этот список можно продолжить.

Любой синтаксис в порядке, если только цифры и буквы в строке равны в сумме. Я пробовал ^([a-zA-Z0-9 -]+)$, который принимает буквенно-цифровые символы, но я не знаю, какое регулярное выражение можно использовать для проверки (общее количество цифр = общее количество алфавитов)

Использование заглядывания ^(?=[^\s]?[0-9])(?=[^\s]?[a-zA-Z])[a-zA-Z0-9]*$, но он находит все строки, которые имеют хотя бы одну букву и одно число.

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Просто, чтобы поместить мои два цента: вы можете написать себе небольшой парсер, например: Python:

from parsimonious.grammar import Grammar
from parsimonious.nodes import NodeVisitor
from parsimonious.exceptions import ParseError

grammar = Grammar(
    r"""
    term        = (digit / alpha)+
    digit       = ~"\d"
    alpha       = ~"[a-zA-Z]"
    """)

class AlnumCounter(NodeVisitor):
    def __init__(self):
        self.reset()

    def reset(self):
        self.abc = 0
        self.digits = 0

    def visit_digit(self, node, children):
        self.digits += 1

    def visit_alpha(self, node, children):
        self.abc += 1

    def visit_term(self, node, children):
        return (self.digits, self.abc)

    def generic_visit(self, node, visited_children):
        return node or visited_children

# list of strings
strings = ['7868HGCD', '87429AJIGH', '8A2K9H7A', '1H2B3C7D9K8L', 'somegarbage', 'parsing error']

alnum = AlnumCounter()
for string in strings:
    try:
        tree = grammar.parse(string)
        out = alnum.visit(tree)

        if out[0] == out[1]:
            print("Correct format: {}".format(string))
        else:
            print("Not correct: {}".format(string))

    except ParseError:
        print("Encountered strange characters within '{}'".format(string))

    finally:
        # reset the counters
        alnum.reset()

Это даст

Correct format: 7868HGCD
Correct format: 87429AJIGH
Correct format: 8A2K9H7A
Correct format: 1H2B3C7D9K8L
Not correct: somegarbage
Encountered strange characters within 'parsing error'
1 голос
/ 03 апреля 2019

Я не знаю, как сделать это с помощью чистого регулярного выражения, но если вы используете регулярное выражение вместе с языком приложения, то эта проблема проста. Например, в Java мы можем попробовать:

String input = "7868HGCD";
if (input.replaceAll("[A-Z]", "").length() ==
    input.replaceAll("[0-9]", "").length()) {
    System.out.println("match");
}
else {
    System.out.println("no match");
}

Идея здесь в том, чтобы использовать регулярное выражение для обрезания букв или цифр, а затем сравнить оставшиеся длины каждого из них.

0 голосов
/ 03 апреля 2019

Это простое решение с использованием метода JavaScript match.

var str = '7868HGCD';

console.log(str.match(/[a-zA-Z]/g).length == str.match(/[0-9]/g).length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...