无法在字符串中获取特定模式

时间:2013-11-14 08:41:15

标签: c# regex

我想在字符串中找到一个特定的子字符串模式。在某种程度上,我能够得到但不完全是我想要提取的内容。

我正在开发一个控制台应用程序。下面我提到了代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string item = @"wewe=23213123i18n("""", test. ),cstr(12),i18n("""",test3)hdsghwgdhwsgd)"; 
            item = @"MsgBox(I18N(CStr(539)," + "Cannot migrate to the same panel type.)" +", MsgBoxStyle.Exclamation, DOWNLOAD_CAPTION)";
            string reg1 = @"i18n(.*),(.*)\)";
            string strVal = Regex.Match(item, reg1, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase).Groups[0].Value;
            List<string> str = new List<string> ();
            str.Add(strVal);
            System.IO.File.WriteAllLines(@"C:\Users\E543925.PACRIM1\Desktop\Tools\Test.txt", str);
        }
    }
}


Expected output -  I18N(CStr(539)," + "Cannot migrate to the same panel type.)
Actual output -  I18N(CStr(539),Cannot migrate to the samepaneltype.),MsgBoxStyle.Exclamation, DOWNLOAD_CAPTION)

我必须对正则表达式进行一些更改。我试过,但没能成功。 我是regex和c#的新手。 请帮忙 。 提前谢谢..

2 个答案:

答案 0 :(得分:1)

您希望.*懒惰(即匹配尽可能少的字符).*?
(或者让你的正则表达式改为"i18n\([^,)]*,[^)]*\)")。

如果你想要多个匹配,那么你应该有一个while循环。

此:

string item = @"wewe=23213123i18n("""", test. ),cstr(12),i18n("""",test3)hdsghwgdhwsgd)"; 
item = @"MsgBox(I18N(CStr(539)," + "Cannot migrate to the same panel type.)" +", MsgBoxStyle.Exclamation, DOWNLOAD_CAPTION)";
string reg1 = @"i18n(.*?),(.*?)\)";
Match match = Regex.Match(item, reg1, RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
while (match.Success)
{
    string strVal = match.Groups[0].Value;
    Console.WriteLine(strVal);
    match = match.NextMatch();
}

打印:

I18N(CStr(539),Cannot migrate to the same panel type.)

Live demo

答案 1 :(得分:0)

你可以试试这个正则表达式:

i18n(\([^\)]*\))

表示:匹配i18n和以开放方式开头的捕获组(除了已关闭之后跟随任何字符)然后关闭)