C# 匹配后跟星号的所有字符串
基本上,我正在为我们的编译器课程创建一个简单的解释器。当然,这不是一个家庭作业类型的问题 任何后跟星号的内容都被视为注释,前提是它不是字符串的一部分。我的解释器中有一个转义字符,它是括号 这些是我的解释器的示例语法C# 匹配后跟星号的所有字符串,c#,.net,regex,C#,.net,Regex,基本上,我正在为我们的编译器课程创建一个简单的解释器。当然,这不是一个家庭作业类型的问题 任何后跟星号的内容都被视为注释,前提是它不是字符串的一部分。我的解释器中有一个转义字符,它是括号 这些是我的解释器的示例语法 * hello world OUTPUT: "This is asterisk [*]" * outputs string OUTPUT: "This is asterisk *" * outputs string produces syntax error x = "[*]" &
* hello world
OUTPUT: "This is asterisk [*]" * outputs string
OUTPUT: "This is asterisk *" * outputs string produces syntax error
x = "[*]" & "hello" & "[*]*]" this is already comment which produces syntax error
当我尝试运行这个Regex
[^\[]\*.*
它与以下内容相匹配:
* hello world
* outputs string
*" * outputs string produces syntax error
]*]" this is already comment which produces syntax error
我的问题是,regex
为什么以前“吃”了一个字符?我已经需要它了
* hello world
* outputs string
*" * outputs string produces syntax error
*]" this is already comment which produces syntax error
您需要使用零宽度断言来停止捕获您只想匹配的条件,并且 不是“吃”:
(?您需要使用零宽度断言来停止捕获您只想匹配的条件,并且
不是“吃”:
(?尝试使用组,并使用组值,如[^\[](\*.*)
尝试使用组,并使用组值,如[^\[](\*.*)
为什么这里需要断言?如果它适用于其他情况,我会尝试。我会回来。@DerekFloss正常匹配意味着“匹配和捕获”,断言意味着“匹配,但不捕获”“。您想检查“*”之前的字符不是“[”,但您不想在最后的匹配中包括该字符,即“”,或“]”等。为什么不包括“*hello world”
?为什么需要在这里使用断言?如果它在其他情况下有效,我会尝试。我会回来。@DerekFloss正常匹配意味着“匹配和捕获,断言意味着”匹配,但不捕获“。您想检查“*”之前的字符不是“[”,但您不想在最终匹配中包含该字符,即“”,或“]”等。为什么不包括*hello world
?
(?<=[^\[])\*.*|^\*.*