C# RegEx-两个标记之间的文本,其中一个标记是可选的

C# RegEx-两个标记之间的文本,其中一个标记是可选的,c#,regex,string,C#,Regex,String,使用正则表达式,是否有一种方法可以提取2个标记之间的所有文本,其中第2个标记是可选的 例如: MARK1 allthetext I need t0 extr4ct i$ here unt.l I_will-find (MARK2 | MARK3 | ANYENDMARK) 或 我试着用 (?<=(MARK1 ))([[:ascii:]]*)(MARK2|MARK3|$)? (?)(?(?你就快到了。让我们从你的第二个表达式开始: (?<=(MARK1 ))([[:ascii:

使用正则表达式,是否有一种方法可以提取2个标记之间的所有文本,其中第2个标记是可选的

例如:

MARK1 allthetext I need t0 extr4ct i$ here unt.l I_will-find (MARK2 | MARK3 | ANYENDMARK)


我试着用

(?<=(MARK1 ))([[:ascii:]]*)(MARK2|MARK3|$)?

(?
)(?
(?你就快到了。让我们从你的第二个表达式开始:

 (?<=(MARK1 ))([[:ascii:]]*)(?=(MARK2|MARK3|$))?
否则,它会选择行结束而不是MARK2或MARK3,因为它可以进行更长的匹配。
*?
将尝试使最短的匹配成为可能

  • 您可能还希望在MARK2和MARK3前面添加一个空格,以避免匹配以MARK2/3结尾的单词

     (?<=(MARK1 ))([[:ascii:]]*?)(?=( MARK2| MARK3|$))
    

    (?差不多了。让我们从第二个表达式开始:

     (?<=(MARK1 ))([[:ascii:]]*)(?=(MARK2|MARK3|$))?
    
    否则,它会选择行结束而不是MARK2或MARK3,因为它可以进行更长的匹配。
    *?
    将尝试使最短的匹配成为可能

  • 您可能还希望在MARK2和MARK3前面添加一个空格,以避免匹配以MARK2/3结尾的单词

     (?<=(MARK1 ))([[:ascii:]]*?)(?=( MARK2| MARK3|$))
    
    (?您可以使用

    (?<=\bMARK1\b)(.*?)(?=(?:\bMARK2\b|\bMARK3\b|$))
    
    (?您可以使用

    (?<=\bMARK1\b)(.*?)(?=(?:\bMARK2\b|\bMARK3\b|$))
    

    (?开始标记不是可选的?试试看。我不相信C#支持任何POSIX类。@Stribizev gothca!它似乎很管用。我不知道\b的正确含义。谢谢,将其作为reply@Riccardo:请检查我的答案。请注意,您不应在regex101.com上测试.NET regex。请使用regexhero.NET或regexstorm.NET。latter提供共享,这就是为什么我将其用于演示目的。@Stribizev非常感谢您对regex101.com和其他网站的清晰回复和建议。我不得不等了几分钟才将您的答案标记为所选答案。开始标记不是可选的?试试看。我相信C#不支持任何POSIX类。@Stribizev gothca!I好像很管用。我不知道\b的正确含义。谢谢你,把它作为reply@Riccardo:请检查我的答案。请注意,您不应在regex101.com上测试.NET regex。请使用regexhero.NET或regexstorm.NET。后者提供共享功能,这就是我将其用于演示目的的原因。@Stribizev非常感谢您明确的回答以及关于regex101.com和其他网站的建议。我等了几分钟才将您的答案标记为所选答案。我现在已经添加了解释。我希望它现在或多或少清晰。我现在已经添加了解释。我希望它现在或多或少清晰。仅供参考:。仅供参考:。
    
     (?<=(MARK1 ))([[:ascii:]]*?)(?=( MARK2| MARK3|$))
    
    (?<=\bMARK1\b)(.*?)(?=(?:\bMARK2\b|\bMARK3\b|$))