Regex 正则表达式匹配字符串中与字母表相等的数字的计数

Regex 正则表达式匹配字符串中与字母表相等的数字的计数,regex,Regex,只是检查是否可以使用正则表达式验证/检查字母数字字符串,以确保其数字和字母总数相同 比如说, 7868HGCD (4 digits, 4 alphabets) 87429AJIGH (5 digits, 5 alphabets) 8A2K9H7A (digits ,alphabets alternately) 1H2B3C7D9K8L …还有很多 只要字符串中的数字和字母总数相等,任何语法都可以。我尝试了^([a-zA-Z0-9-]+)$,它接受字母数字,但我不知道可以使用什么正则表达式来检查

只是检查是否可以使用正则表达式验证/检查字母数字字符串,以确保其数字和字母总数相同

比如说,

7868HGCD (4 digits, 4 alphabets)
87429AJIGH (5 digits, 5 alphabets)
8A2K9H7A (digits ,alphabets alternately)
1H2B3C7D9K8L
…还有很多

只要字符串中的数字和字母总数相等,任何语法都可以。我尝试了
^([a-zA-Z0-9-]+)$
,它接受字母数字,但我不知道可以使用什么正则表达式来检查(总数字=总字母)


使用lookahead
^(?=[^\s]?[0-9])(?=[^\s]?[a-zA-Z])[a-zA-Z0-9]*$
但它会查找所有至少有一个字母和一个数字的字符串。

我不知道使用纯正则表达式的方法,但如果您将正则表达式与应用程序语言一起使用,那么这个问题就很简单了。例如,在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");
}

这里的想法是使用正则表达式,或者剥离字母或数字,然后比较每个字母或数字的剩余长度。

这是一个使用JavaScript
match
方法的简单解决方案

var str='7868HGCD';

console.log(str.match(/[a-zA-Z]/g).length==str.match(/[0-9]/g).length)只需花我的两分钱:您可以自己编写一个小型解析器,例如在
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'

我不认为正则表达式是这里使用的工具。你试图做的事情打破了常规语言的规则。你不能用正则表达式来计算-使用你选择的编程语言来计算。@Jan你不能用正则表达式来计算,但你肯定可以用正则表达式来计算,哈哈。正则表达式节省了时间!疯狂,但可能是解决此问题最有效的方法+1(regex总是会产生开销)