正则表达式 - 匹配某个字符前的模式

15

我目前正在使用c#构建一个玩具汇编器(通过 计算机系统要素 书籍)。

我需要匹配非常简单的模式,我认为这是学习一些正则表达式的好时机,但我很困难!

在以下示例中,我只想匹配'='前面的字母

M=A

D=M

MD=A

A=D

AD=M

AMD=A

我想出了以下内容:

([A-Z]{1,3})=

然而,这也匹配了我不想要的等号“=”。

我还尝试过:

([A-Z^\=]{1,3})=

但是我仍然有同样的问题 - 它也匹配了'='符号。

我正在使用这个网站测试我的正则表达式。

非常感谢任何帮助。 提前致谢。


你还需要获取 .Groups[1].Value.ToString() 以便从等号符号中获取适当的部分。 - DevelopingChris
5个回答

33
你需要的是一个零宽度的前瞻断言。你可以这样写:
(匹配并捕获此内容)(?=在此之前的内容)
根据你的需求,代码如下:
([A-Z^]{1,3})(?==)

31
你需要一个正向先行断言:

您需要一个正向先行断言

([A-Z]{1,3})(?==)

4
以下内容将把等号前后的所有内容分组。
([^=]*)=([^=]*)

这段文字的意思是:

匹配任何不是 "=" 的字符,然后紧跟着一个 "=",最后再匹配任何不是 "=" 的字符。


我在http://www.nregex.com/nregex/default.aspx中尝试了您的正则表达式, 但似乎不起作用 - 可能是该网站使用的正则表达式引擎出了点问题?无论如何,我现在已经标记了一个答案,所以不用担心。还是谢谢。 - handles
这个正则表达式的问题可能在于,如果它是多行的,第二个通配符将匹配当前等号后面的部分、换行符,以及下一个等号之前的字符。你需要在第二对方括号内添加定界符字符。 - Conspicuous Compiler

0

你也可以将等号放在一个非捕获括号中,使用 (?: ... )

([ADM]{1,3})(?:=)

我已经有一段时间没有做这本书的这一章了,但我认为既然你需要表达式的两个部分,我在等号上进行了拆分,结果是myArray [0] == M,myArray [1] == A。


非捕获括号不会有任何有用的作用。等号仍然会被“捕获”作为整体匹配的一部分,这正是OP试图避免的。 - Alan Moore

-2

我需要匹配等于号之前的每个字符,所以我想出了这个方法

.*(?==)=

匹配等号之前的每个字符,但不包括等号本身


这个问题已经得到了充分的回答,我刚才使用 == 匹配了你的表达式,但似乎并不起作用。感谢您的参与。 - Maarten Bodewes
现在,当我将行为与正确答案进行比较时,我发现这不是 OP 想要的。 - Tola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接