Regex奇怪的行为

本文关键字:Regex | 更新日期: 2023-09-27 18:21:36

我正在尝试创建一个C#/WPF解析器。我对正则表达式有很好的总体理解,因为这不是我的第一个解析器(可能也不会是我的最后一个)

然而,现在我有一个非常奇怪的行为。以下是我试图解析的内容(注意:实际数据已删除,我只是制作了一个与我的结构相同的字符串):

aaaaa-bbbbb 50 c blabla

我的应用程序会收到我只想拆分和识别的行。由于某种原因,空格的数量是可变的(一个在aaaa和bbbb之间,两个在bbbb和50之间…)。(在人们告诉我之前,请注意:我不会使用string.Splitt()。因为我有很多不同的行结构,我应该总是从中获得相同的数据。只是拆分它会让我无法识别每个部分的含义)

我目前的测试正则表达式有点简单:

('S*)['s*]('S*)['s*]('S*)['s*](p|c)(.*)

现在,事情是这样的。当bbbbb和50之间只有一个空格时,正则表达式将正确解析(注意:我使用http://www.myregextester.com/index.php测试我的正则表达式)

$matches Array:
(
    [0] => Array
        (
            [0] => aaaaa bbbbb 50 c  blabla
        )
    [1] => Array
        (
            [0] => aaaaa
        )
    [2] => Array
        (
            [0] => bbbbb
        )
    [3] => Array
        (
            [0] => 50
        )
    [4] => Array
        (
            [0] => c
        )
    [5] => Array
        (
            [0] =>   blabla
        )
)

如果bbbb和50之间有两个空格,则会发生以下情况:

$matches Array:
(
    [0] => Array
        (
            [0] => bbbbb  50 c blabla
        )
    [1] => Array
        (
            [0] => bbbbb
        )
    [2] => Array
        (
            [0] => 
        )
    [3] => Array
        (
            [0] => 50
        )
    [4] => Array
        (
            [0] => c
        )
    [5] => Array
        (
            [0] =>  blabla
        )
)

现在我知道我可以很容易地从行中删除不需要的空格(这就是我目前所做的)。无论如何,我很想知道我错过了什么:为什么当我添加一个额外的空间时会发生这种情况,而这个空间应该用我添加的[''s*]之一来识别?

谢谢!

Regex奇怪的行为

['s*]没有按照您的期望行事。方括号表示一个字符组,这意味着它将与's(空格)或文字*的字符相匹配。

只需放下这些括号即可获得预期行为:匹配's(一个空格)0次或更多次:

('S*)'s*('S*)'s*('S*)'s*(p|c)(.*)

编辑:Jesse的话也很有价值:除非某些组真的是可选的,否则你可能想使用+而不是*量词。

每当我在正则表达式中看到星号时,我都会感到尴尬。星匹配零或更多,真的会绊倒你!将*的所有实例替换为+,然后重试。当然,除非其中一些分组确实是可选的。

编辑:其他答案非常正确,注意你使用了一个字符组,但我的观点仍然是:注意*

您需要将['s*]替换为's+

['s*]的意思是"要么一个空白字符,要么一个星号"。

's+的意思是"一个或多个空白字符",这正是您想要的。

角色类是很多人都会犯错的地方。

[''s*]有不同的含义,因为它在方括号内[''s]+将显示您想要的行为,或者[''s]{1,}此表达式将与空白字符匹配1次或多次。你还需要记住,根据你使用的函数,你可能需要启用"g"标志,这是一个全局标志,使正则表达式能够匹配你想要解析的模式的所有出现,否则它可能只解析第一个匹配。括号否定了大多数字符类,并将大多数修饰符转换为文字,除了少数例外访问MDNhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions回顾有关正则表达式在方括号或正则表达式上的PHP API中的行为的知识http://php.net/manual/en/reference.pcre.pattern.syntax.php