当前位置: 首页 > 知识库问答 >
问题:

正则表达式查找信用卡模式不排除超过16位的模式

幸越泽
2023-03-14

我们正在构建一个模式匹配器,从字符串中查找信用卡模式(不一定是有效的)。目前,我们正在使用正则表达式.info中的正则表达式

\b(?:\d[ -]*?){13,16}\b

正则表达式可以正常工作,除非它试图排除长于16位且具有空格或破折号分隔符的无效数字,例如:

1234 5678 9001 0000 1111
1234-5678-9001-0000-1111
1234 5678 9001 00001 111
1234-5678-9001-00001-111

正则表达式将包括数字的某些部分,并将其标记为匹配。这不是我们所期望的。你可以在regex101.com上看到它

有人能帮我们吗?

共有2个答案

皇甫敏达
2023-03-14

由于您似乎有一个分隔符,因此可以拆分条目,然后在此正则表达式上测试它(?:\d[-]*?){13,16}$:

static void Main(String[] args)
{
    var myInput = "5000123456789001, 5000-1234-5678-9001, 5000 1234 5678 9001, 50001234567890010000, 5000-1234-5678-9001-0000, 5000 1234 5678 9001 0000, 5000-1234-5678-90010-000, 5000 1234 5678 90010 000";

    foreach (var cardNumber in SeparateInput(myInput, ','))
    {
        Console.WriteLine($"'{cardNumber}' is {(IsThisNumberValid(cardNumber) ? "valid" : "not valid" )}");
    }

    Console.ReadLine();
}

private static bool IsThisNumberValid(string input)
{
    return Regex.IsMatch(input, @"^(?:\d[ -]*?){13,16}$");
}

private static IEnumerable<string> SeparateInput(string input, char separator)
{
    foreach (var splitted in input.Split(new []{separator}, StringSplitOptions.RemoveEmptyEntries))
    {
        yield return splitted.Trim();
    }
}
袁弘化
2023-03-14

如果你需要跳过一些东西,只得到其他东西,那么更容易匹配你想要跳过的东西,匹配并捕获你需要保留的东西。

使用

\b(?:(?:\d[ -]*?){17,}|((?:\d[ -]*?){13,16}))\b

请参阅正则表达式演示。

详细信息

  • \b-单词边界
  • (?:-外部非捕获组:
    • (?:\d[ -]*?){ 17,}-17位或更多数字,可选用0个空格分隔或-
    • |-或
    • ((?:\d[ -]*?){ 13,16})-第1组匹配13到16次出现的数字,后跟0个空格或/和连字符

    C代码:

    var values_we_need = Regex.Match(our_text, @"\b(?:(?:\d[ -]*?){17,}|((?:\d[ -]*?){13,16}))\b")
        .Cast<Match>()
        .Select(m => m.Groups[1].Value)
        .ToList();
    

 类似资料:
  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)

  • 我是正则表达式的初学者,并尝试搜索特定的数字模式。以下数据以 XML 格式嵌入。 要求是提取数据(最里面的列表)。在这个例子中,数据从24779开始到24760。注意:每次数据可能不是从“24”开始。因此,我计划通过以下逻辑提取:如果标签名(在本例中:DUT_1_PC)具有非零的有效数据,并且有效数据的计数大于100,用逗号分隔,则提取该列表及其标签名(DUT_1_PC)。 我无法提取所需的数据。

  • 问题内容: 这个正则表达式模式: 产生以下结果: 如何删除“ cID =“? 谢谢 问题答案: 您可以使用lookbehind(不在Javascript中): 或者,您可以使用分组并获取第一个分组:

  • 问题内容: 我需要这件事的帮助。查看以下正则表达式: 我想查找这样的词:“自制”,“ aaaa-bbb”而不是“ aaa-bbb”,而 不是 “ aaa–aa–aaa”。基本上,我想要以下内容: 单词-连字符-单词。 它适用于所有内容,但该模式会通过:“ aaa–aaa–aaa”,但不应通过。哪种正则表达式适用于此模式? 问题答案: 可以从表达式中删除反斜杠: 下面的代码应该工作 请注意,您可以使

  • 我对正则表达式很陌生,正在寻找一个匹配任何东西的表达式,除了所有匹配给定正则表达式的东西。我已经找到了除了特定字符串以外的任何东西的方法,但是我需要它不匹配一个正则表达式。它还必须在Java工作。 背景:我正在使用ANSI颜色的字符串。我想取一个字符串,它有一些文本,可能是用Ansi颜色代码格式化的,并删除除那些颜色代码以外的任何东西。这将给出附加到字符串上的任何字符的当前颜色格式。 格式化字符串

  • 我在Visual C#中为信用卡号码验证器创建正则表达式时遇到一些问题。卡的数字需要用破折号(-)分隔,第一个数字必须是1-9,第二组数字必须是1-3。所以一个例子是2204-1232-9746-5558或1111-1111-1111-1111。 以下是我目前掌握的情况: 我尝试的每个卡号都会给出相同的结果,该号码无效。谁能把我引向正确的方向?非常感谢!