gpt4 book ai didi

c# - 当定界符可以在 token 中时使用 RegEx 进行 token 化

转载 作者:行者123 更新时间:2023-11-30 18:36:05 24 4
gpt4 key购买 nike

我正在用 C# 解析一些输入,但在 RegEx 处理方面遇到了瓶颈。

免责声明:我不是正则表达式专家,但我正在学习更多。

我有一个看起来像这样的输入字符串:

ObjectType [property1=value1, property2=value2, property3=AnotherObjectType [property4=some value4]]

(一个人为的值,但重要的是它们可以嵌套)。

我正在执行以下操作来标记字符串:

Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)");
string[] tokens = Tokenizer.Split(s);

这让我完成了大约 98% 的工作。这会将字符串拆分为已知分隔符,逗号后跟一个空格。

上面例子中的token是:

ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
some value4
]
]

但是我有两个问题:

1) 属性值可以包含逗号。这是一个有效的输入:

ObjectType [property1=This is a valid value, and should be combined,, property2=value2, property3=AnotherObjectType [property4=value4]]

我希望 property1= 之后的标记是:

This is a valid value, and should be combined,

而且我希望保留 token 中的空格。目前,它会在找到逗号时拆分。

2) 拆分时,逗号标记包含空格。如果可能的话,我想摆脱它,但这是一个不太重要的优先事项。

我尝试了各种选择,它们都让我部分地达到了目标。我所拥有的最接近的是:

    Regex Tokenizer = new Regex(@"([=\[\]])|(,\s)|([\w]*\s*(?=[=\[\]]))|(.[^=]*(?=,\s))");

为了匹配分隔符,一个逗号后跟一个空白字符,文字字符后跟一个空白字符之前的文字,以及一个逗号和空白字符之前的文本(不包括 = 符号)。

当我得到匹配而不是调用 split 时,我得到了这个:

ObjectType
[
property1
=
value1
,
property2
=
value2
,
property3
=
AnotherObjectType
[
property4
=
value4
]
]

注意 property4 中缺少的信息。更复杂的输入有时会在标记中包含右括号,如下所示:value4]我不确定为什么会这样。关于如何对此进行改进的任何想法?

谢谢,菲尔

最佳答案

使用词法分析器和解析器工具最容易回答这个问题。许多人认为它们对于这些“简单”的用例来说太复杂了,尽管我总是发现它们更清晰、更容易推理。你不会陷入愚蠢的 if 逻辑。

对于 C#,GPLEXGPPG似乎是一些不错的。参见 here for why you might want to use them .

在您的情况下,您有一个语法,这就是您如何根据上下文定义不同标记之间的交互。而且,您还拥有在您选择的语言和工具链中实现此语法的详细信息。语法相对容易定义,您已经非正式地定义过了。细节是棘手的部分。如果您有一个框架可以读取一些定义的写出语法位的方式并只生成代码来实际执行它,那不是很好吗?

简而言之,这就是这些工具的工作原理。文档非常短,所以通读所有文档,提前花时间会有很大帮助。

本质上,您将声明一个扫描器和解析器。扫描器接收文本流/文件并将其与各种正则表达式进行比较,直到匹配为止。该匹配作为标记传递给解析器。然后匹配下一个标记并向上传递,循环直到文本流清空。

每个匹配的 token 都可以附加任意 C# 代码,解析器中的每个规则也是如此。

我通常不使用 C#,但我编写了很多词法分析器和解析器。跨语言的原则是相同的。这是解决您问题的最佳解决方案,并将在您的整个职业生涯中一次又一次地帮助您。

关于c# - 当定界符可以在 token 中时使用 RegEx 进行 token 化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129999/

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