C# 如何使用正则表达式确定下一个允许使用哪个字符

C# 如何使用正则表达式确定下一个允许使用哪个字符,c#,regex,validation,input,mask,C#,Regex,Validation,Input,Mask,如何使用正则表达式确定允许哪个字符作为下一个输入 我想处理用户的顺序输入,并允许或禁止输入下一个字符,无论其是否合法 例如,给定以下正则表达式:^\d{0,1}\d:\d\d$它匹配字符串,如12:34,1:23,如果整个字符串都给定,但如果字符一个接一个地键入,它就会工作。到目前为止,我无法确定子字符串是否与正则表达式匹配 给定子字符串1,我想确定下一个字符应该是[0-9]或: 如何做到这一点 谢谢你的回复 对于正则表达式问题,我试图得到最直接的答案。所以在这里,我会写下所有可能的输入都是有效

如何使用正则表达式确定允许哪个字符作为下一个输入

我想处理用户的顺序输入,并允许或禁止输入下一个字符,无论其是否合法

例如,给定以下正则表达式:
^\d{0,1}\d:\d\d$
它匹配字符串,如
12:34
1:23
,如果整个字符串都给定,但如果字符一个接一个地键入,它就会工作。到目前为止,我无法确定子字符串是否与正则表达式匹配

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

如何做到这一点


谢谢你的回复

对于正则表达式问题,我试图得到最直接的答案。所以在这里,我会写下所有可能的输入都是有效的

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

  • \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)$
    

    谢谢大家的回答,我学到了一些关于regex的新知识,但它不能满足我的需要。也许我对这个问题不够具体

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

    //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的正则表达式引擎。
    我曾经 它是基于状态的,每个状态都会公开从哪里可以获得有效的字符以迭代到下一个状态的转换。实现一个运行程序,它维护状态并使您能够逐步迭代输入文本。 查看BasicOperation.Run(自动化a,字符串s)以了解如何使用此库实现IsMatch的示例

    为什么不能使用标准正则表达式类

    标准库侧重于高效和允许强大的正则表达式功能的目标。最先进的技术是实现带回溯的模式迭代方法,而不是文本迭代方法,这有很好的理由。此外,它还将regex模式编译成某种机器指令,以便可以非常快速地执行。你看,没有机会一步一步地把它处理好。这就是为什么您需要基于DFA/NFA的方法,这种方法可能不会那么快,但具有其他优势

    使用lookarounds检查每个可选的子模式。不过,这取决于正则表达式的味道。带有lookaheads。不过,请详细说明您的编程语言/regex风格。我使用C#,希望使用标准的regex classTry
    //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
    }