【问题标题】:How to use RegEx to determine which character is allowed next如何使用 RegEx 确定下一个允许哪个字符
【发布时间】:2016-12-04 05:25:38
【问题描述】:

如何使用 Regex 确定允许哪个字符作为下一个输入?

我想处理来自用户的连续输入,并允许或禁止输入下一个字符,无论其合法与否。

例如,给定以下正则表达式:^\d{0,1}\d:\d\d$ 它匹配诸如12:341:23 之类的字符串,如果给出了整个字符串但如果字符是一个接一个地输入,则它可以工作。到目前为止,我无法确定子字符串是否与正则表达式匹配。

给定子字符串1,我想确定下一个字符应该是[0-9]:

如何做到这一点?

感谢您的回复!

【问题讨论】:

标签: c# regex validation input mask


【解决方案1】:

谢谢大家的回答,我学到了一些关于正则表达式的新知识,但它并没有满足我的需求。也许我对这个问题不够具体。

我真正想要的是按顺序处理字符。 我想要一个正则表达式引擎,我可以在其中传递任意正则表达式模式并查询下一个用户输入是否有效(基于所有先前的输入),并且我希望能够检索下一个字符可能用于 auto 的字符集-完成机制

//pseudo code

void main(string[] args){
    Regex regex = new Regex("^1(2|3)4$");
    RegexProcessor processor = new RegexProcessor(regex);

    bool step1 = processor.Input('1'); //return true and iterates to next step
    char[] validInput = processor.GetValidInput(); //returns new char[]{'2','3'}

    bool step2 = processor.Input('4'); //return false because on step2 (2|3) is accepted
}

解决方案: 获取基于 DFA/NFA 的正则表达式引擎。
我用https://github.com/moodmosaic/Fare 它是基于状态的,每个状态都暴露了转换,您可以从中获取有效的字符以迭代到下一个状态。实现一个运行器来维护状态并使您能够逐步迭代输入文本。 查看 BasicOperation.Run(Automation a,string s) 以了解如何使用此库实现 IsMatch。

为什么不能使用标准的 Regex 类
标准库专注于高效并允许强大的正则表达式功能的目标。现有技术是使用回溯实现模式迭代方法而不是文本迭代方法,这是有充分理由的。此外,它将正则表达式模式编译为某种机器指令,因此可以非常快速地执行。您会看到没有机会一步一步地挂钩和处理它。这就是为什么您需要基于 DFA/NFA 的方法,这种方法可能不会那么快,但具有其他优势

【讨论】:

    【解决方案2】:

    我尝试为正则表达式问题提供最直接的答案。所以在这里,我将首先写出所有可能的有效输入。

    遍历每个键入的字符数的所有可能输入。

    1. \d
    2. \d:|\d\d
    3. \d\d:|\d:\d
    4. \d\d:\d|\d:\d\d
    5. \d\d:\d\d

    将所有这些放在一起为我们提供了第一个可能的答案(但不是一个很好的答案)

    ^(\d|\d:|\d\d|\d\d:|\d:\d|\d\d:\d|\d:\d\d|\d\d:\d\d)$
    

    对第一部分稍微聪明一点减少了选项的数量。

    • \d\d?
    • \d\d?:
    • \d\d?:\d
    • \d\d?:\d\d

    把它放在一起给你。

    ^(\d\d?|\d\d?:|\d\d?:\d|\d\d?:\d\d)$
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多