繁体   English   中英

正则表达式奇怪的行为

[英]Regex strange behavior

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

但是,现在我有一种非常奇怪的行为。 这是我要解析的内容(注意:删除了实际数据,我只是按照与我相同的结构制作了一个字符串):

aaaaa bbbbb 50 c blabla

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

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

(\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 *]中的一个来识别?

谢谢!

[\\s*]没有做你期望的事情。 方括号表示一个字符组,这意味着它将匹配一个字符,即\\s (空格)或文字*

只需删除这些括号即可获得预期的行为:匹配\\s (空格)0次或更多次:

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

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

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

编辑:其他答案非常正确地注意到你使用的是一个角色组,但我的观点仍然存在:注意*

你需要用\\s+替换[\\s*]

[\\s*]表示“一个空格字符或一个星号”。

\\s+表示“一个或多个空白字符”,这就是你想要的。

角色类是很多人都错了。

[\\ s *]具有不同的含义,因为它位于括号内[\\ s] +会显示您想要的行为或[\\ s] {1,}此表达式将匹配空格字符1次或更多次。您还需要请记住,根据您使用的功能,您可能需要启用'g'标志,这是全局标志,以使您的正则表达式匹配您要解析的模式的所有匹配项,否则它只能解析第一个匹配项。 括号否定大多数字符类并将大多数修饰符转换为文字,除了少数例外,请访问MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions查看您对正则表达式如何在内部表现的知识正则表达式上的括号或PHP API http://php.net/manual/en/reference.pcre.pattern.syntax.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM