gpt4 book ai didi

c# - 正则表达式奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 19:42:18 25 4
gpt4 key购买 nike

我正在尝试创建一个 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(空格)或 literal * 的字符。

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

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

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

关于c# - 正则表达式奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17551397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com