C# 中的 RegExpr 用于获取值

发布于 2024-10-04 12:21:00 字数 1273 浏览 7 评论 0原文

我有 C# 中的任何文本,我需要使用正则表达式“匹配”,并获取一个值(解析文本以获取值)。

文本:

var asunto1 = "ID P20101125_0003 -- 授权待决 --";

var asunto2 = "ID P20101125_0003 任意 发送任何文本”;

var asunto3 = "ID_P20101125_0003 任意 发送任何文本”;

我需要获取值:

var peticion = "P20101125_0003";

我有这个正则表达式,但对我来说失败了:

    //ID P20101125_0003 -- Pendiente de autorización --

            patternPeticionEV.Append(@"^");
            patternPeticionEV.Append(@"ID P");
            patternPeticionEV.Append(@"(20[0-9][0-9])"); // yyyy
            patternPeticionEV.Append(@"(0[1-9]|1[012])"); // MM
            patternPeticionEV.Append(@"(0[1-9]|[12][0-9]|3[01])"); // dd
            patternPeticionEV.Append(@"(_)"); 
            patternPeticionEV.Append(@"\d{4}");
            //patternPeticionEV.Append(@"*");
            patternPeticionEV.Append(@"$");

if (System.Text.RegularExpressions.Regex.IsMatch(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                var match = System.Text.RegularExpressions.Regex.Match(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
//...
            }

I have any text in C#, and I need "match" using Regular Expressions, and get a value (parsing the text for get the value).

Texts:

var asunto1 = "ID P20101125_0003 --
Pendiente de autorización --";

var asunto2 = "ID P20101125_0003 any
text any text";

var asunto3 = "ID_P20101125_0003 any
text any text";

I need get the value:

var peticion = "P20101125_0003";

I have this regular expression, but fails for me:

    //ID P20101125_0003 -- Pendiente de autorización --

            patternPeticionEV.Append(@"^");
            patternPeticionEV.Append(@"ID P");
            patternPeticionEV.Append(@"(20[0-9][0-9])"); // yyyy
            patternPeticionEV.Append(@"(0[1-9]|1[012])"); // MM
            patternPeticionEV.Append(@"(0[1-9]|[12][0-9]|3[01])"); // dd
            patternPeticionEV.Append(@"(_)"); 
            patternPeticionEV.Append(@"\d{4}");
            //patternPeticionEV.Append(@"*");
            patternPeticionEV.Append(@"$");

if (System.Text.RegularExpressions.Regex.IsMatch(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                var match = System.Text.RegularExpressions.Regex.Match(asuntoPeticionEV, exprRegular, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
//...
            }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

叫嚣ゝ 2024-10-11 12:21:00

您的正则表达式以“$”结尾,表示“行/文本必须在那里结束”。你不想要这样。只要去掉这一行:

patternPeticionEV.Append(@"$");

它基本上会立即起作用。然后,您只需添加一个捕获组来隔离所需的文本位。

我还建议添加 using System.Text.RegularExpressions; ,这样您就不必每次都完全限定 Regex 。您还可以调用 Match 然后检查是否成功,以避免匹配两次。

示例代码:

using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        DisplayMatch("ID P20101125_0003 -- Pendiente de autorización --");
        // No match due to _
        DisplayMatch("ID_P20101125_0003 any text any text");
    }

    static readonly Regex Pattern = new Regex
        ("^" + // Start of string
         "ID " +
         "(" + // Start of capturing group
         "P" +
         "(20[0-9][0-9])" + // yyyy
         "(0[1-9]|1[012])" + // MM
         "(0[1-9]|[12][0-9]|3[01])" + // dd
         @"_\d{4}" +
         ")" // End of capturing group
         );

    static void DisplayMatch(string input)
    {
        Match match = Pattern.Match(input);
        if (match.Success)
        {
            Console.WriteLine("Matched: {0}", match.Groups[1]);
        }
        else
        {
            Console.WriteLine("No match");
        }
    }
}

Your regular expression ends with "$" which says "the line/text has to end there". You don't want that. Just get rid of this line:

patternPeticionEV.Append(@"$");

and it will mostly work immediately. You then just need to add a capturing group to isolate the bit of text that you want.

I'd also recommend adding using System.Text.RegularExpressions; so that you don't have to fully qualify Regex each time. You can also call Match and then check for success, to avoid matching it twice.

Sample code:

using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        DisplayMatch("ID P20101125_0003 -- Pendiente de autorización --");
        // No match due to _
        DisplayMatch("ID_P20101125_0003 any text any text");
    }

    static readonly Regex Pattern = new Regex
        ("^" + // Start of string
         "ID " +
         "(" + // Start of capturing group
         "P" +
         "(20[0-9][0-9])" + // yyyy
         "(0[1-9]|1[012])" + // MM
         "(0[1-9]|[12][0-9]|3[01])" + // dd
         @"_\d{4}" +
         ")" // End of capturing group
         );

    static void DisplayMatch(string input)
    {
        Match match = Pattern.Match(input);
        if (match.Success)
        {
            Console.WriteLine("Matched: {0}", match.Groups[1]);
        }
        else
        {
            Console.WriteLine("No match");
        }
    }
}
注定孤独终老 2024-10-11 12:21:00

这可能只是我的问题,但对于将字符串解析为有意义的值之类的事情,我更喜欢做一些更详细的事情,如下所示:

    private bool TryParseContent(string text, out DateTime date, out int index)
    {
        date = DateTime.MinValue;
        index = -1;

        if (text.Length < 17)
            return false;

        string idPart = text.Substring(0, 4);

        if (idPart != "ID_P" && idPart != "ID P")
            return false;

        string datePart = text.Substring(4, 8);

        if (!DateTime.TryParseExact(datePart, "yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None, out date))
            return false;

        // TODO: do additional validation of the date

        string indexPart = text.Substring(13, 4);

        if (!int.TryParse(indexPart, out index))
            return false;

        return true;
    }

This might be just me but for things like parsing strings into meaningful values I prefer to do something more verbose like this:

    private bool TryParseContent(string text, out DateTime date, out int index)
    {
        date = DateTime.MinValue;
        index = -1;

        if (text.Length < 17)
            return false;

        string idPart = text.Substring(0, 4);

        if (idPart != "ID_P" && idPart != "ID P")
            return false;

        string datePart = text.Substring(4, 8);

        if (!DateTime.TryParseExact(datePart, "yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.None, out date))
            return false;

        // TODO: do additional validation of the date

        string indexPart = text.Substring(13, 4);

        if (!int.TryParse(indexPart, out index))
            return false;

        return true;
    }
姜生凉生 2024-10-11 12:21:00

为什么不使用如下所示的子字符串:

var asunto1 = "ID P20101125_0003 -- Pendiente de autorización --";
var asunto2 = "ID P20101125_0003 any text any text";
var asunto3 = "ID_P20101125_0003 any text any text";

var peticion = asunto1.Substring(3,14); //gets P20101125_0003

Why not use substring like below:

var asunto1 = "ID P20101125_0003 -- Pendiente de autorización --";
var asunto2 = "ID P20101125_0003 any text any text";
var asunto3 = "ID_P20101125_0003 any text any text";

var peticion = asunto1.Substring(3,14); //gets P20101125_0003

这个正则表达式将为您提供所需的字符串

^ID[_ ]P[0-9_]+?

This regex will give you desired string

^ID[_ ]P[0-9_]+?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文