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
(?<=[^\[])\*.*|^\*.*