gpt4 book ai didi

c# - 如何分割这个字符串

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

我有一些字符串,由用户输入,可能如下所示:

  1. ++7
    • 7++
    • 1++7
    • 1+7
    • 1++7+10++15+20+30++

这些是指:

  1. 7 岁以下的任何人
    • 7 岁及以上
    • 1 和 7 以及介于两者之间的任何值
    • 仅限 1 和 7
    • 1至7岁、10至15岁、20岁和30岁及以上

我需要将这些字符串解析为实际范围。那就是我需要创建一个范围类型的对象列表,它有一个开始和一个结束。对于单个项目,我只是将开始和结束设置为相同,对于那些高于或低于的项目,我将开始或结束设置为空。例如,对于第一个,我会得到一个开始设置为空且结束设置为 7 的范围。

我目前有一种使用正则表达式进行拆分和解析的凌乱方法,我想简化它。我的问题是我需要先拆分 +,然后再拆分++。但是,如果我先拆分 +,那么++ 实例就会被破坏,最后我会搞得一团糟。

看看这些字符串,应该很容易解析它们,但我只是想不出一个聪明的方法来解析它们。它只需要是一种更简单(更清晰、更易于阅读)的方式。可能涉及一些我以前从未听说过的简单概念 :P


正则表达式如下所示:

private readonly Regex Pattern = new Regex(@"  ( [+]{2,} )?
([^+]+)
(?:
(?: [+]{2,} [^+]* )*
[+]{2,} ([^+]+)
)?
( [+]{2,} )? ", RegexOptions.IgnorePatternWhitespace);

然后像这样使用:

public IEnumerable<Range<T>> Parse(string subject, TryParseDelegate<string, T> itemParser)
{
if (string.IsNullOrEmpty(subject))
yield break;


for (var item = RangeStringConstants.Items.Match(subject); item.Success; item = item.NextMatch())
{
var startIsOpen = item.Groups[1].Success;
var endIsOpen = item.Groups[4].Success;
var startItem = item.Groups[2].Value;
var endItem = item.Groups[3].Value;

if (endItem == string.Empty)
endItem = startItem;

T start, end;

if (!itemParser(startItem, out start) || !itemParser(endItem, out end))
continue;

yield return Range.Create(startIsOpen ? default(T) : start,
endIsOpen ? default(T) : end);
}
}

它有效,但我认为它的可读性或可维护性不是特别好。例如,将“+”和“++”更改为“,”和“-”就不是那么简单了。

最佳答案

My problem is that I need to split on + first, and then on ++. But if I split on + first, then the ++ instances are ruined and I end up with a mess.

你可以先在这个正则表达式上拆分:

(?<!\+)\+(?!\+)

这样,只有“单个”+ 被拆分,让您解析 ++。请注意,我假设不可能有三个连续的 +

简单上面的正则表达式说:“只有在它前面或后面没有 '+' 的情况下才拆分 '+'”。

编辑:

在阅读到可以有超过 2 个连续的 + 后,我建议编写一个小语法并让解析器生成器为您的小语言创建一个词法分析器+解析器。 ANTLR 也可以生成 C# 源代码。

编辑 2:

但是在实现任何解决方案(解析器或正则表达式)之前,您首先必须定义什么是 什么不是 有效输入。如果您要让两个以上的连续 + 有效,即。 1+++++5,即[1++, +, ++5],我会写一点语法。请参阅本教程它是如何工作的:http://www.antlr.org/wiki/display/ANTLR3/Quick+Starter+on+Parser+Grammars+-+No+Past+Experience+Required

如果您要拒绝超过 2 个连续 + 的输入,您可以使用 Lasse 的或我的(第一个)正则表达式建议。

关于c# - 如何分割这个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1741810/

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