我想获取_T("内部所有内容")中的“内部所有内容”
_T("_T()")这种情况如果也要去获取,应该怎么写想这种结果应该是:"_T()"
这正则应该怎么写呢我的DEMO还有问题:
WPF的:
xaml:<Window x:Class="RegexpTestingProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button x:Name="btn1" Content="Button" HorizontalAlignment="Left" Margin="200,219,0,0" VerticalAlignment="Top" Width="75"/>
        <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="156" Margin="40,34,0,0" TextWrapping="Wrap" Text="TextBox_T('test1')('test2')" VerticalAlignment="Top" Width="417"/>    </Grid>
</Window>.cs:using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Documents;namespace RegexpTestingProject
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private const string p1 = "_T\\(\"(.*)\"\\)";
        private const string p2 = "(_T\\('([^\\('\\)]+)'\\))|(_T\\(\"([^\\(\"\\)]+)\"\\))";        private Regex r1;
        private Regex r2;        public List<Regex> rs;        public MainWindow()
        {
            InitializeComponent();
            this.textBox1.Text = "_T(\"这是带有\"号的字符串内容,不可以配置,但我也想配置\")_T('这是带有'号字符串内容,不可以配置,但我也想配置')";
            this.textBox1.Text += "_T(\"这是没有带双引号,并使用双引号引起来的字符串内容,可以匹配\")_T('这是没有带单引号,并使用单引号引起来的字符串内容,可以匹配')";
            this.textBox1.Text += "_T(\"test3\")\n(\"tes\n_T('test5')\nt\n_T(\"test6\")\n4\")";
            this.btn1.Click += btn1_Click;            r1 = new Regex(p1);
            r2 = new Regex(p2, RegexOptions.Multiline);            rs = new List<Regex>(new Regex[] {
                //r1,
                r2 
            });
        }        void btn1_Click(object sender, RoutedEventArgs e)
        {
            string txt = this.textBox1.Text;            List<string> result = pickUpAllLanguageStr(txt);
            string reusltStr = string.Empty;
            foreach (var item in result)
            {
                reusltStr += "\t" + item + "\n";
            }            MessageBox.Show("\npick up result : " + reusltStr);
        }        public List<string> pickUpAllLanguageStr(string inputTxt)
        {
            List<string> result = new List<string>();
            foreach (var r in rs)
            {
                MatchCollection mc = r.Matches(inputTxt);
                for (int i = 0; i < mc.Count; i++)
                {
                    var g1 = mc[i].Groups[2].Value;
                    if (string.IsNullOrEmpty(g1))
                    {
                        g1 = mc[i].Groups[4].Value;
                    }
                    if (string.IsNullOrEmpty(g1))
                    {
                        continue;
                    }
                    if (!result.Contains(g1))
                    {
                        result.Add(g1);
                    }
                }
            }
            return result;
        }
    }
}运行结果,截图:
C#正则正则表达式

解决方案 »

  1.   

    _T()内的字符串会相当丰富,几基础上什么情况都有可能,如:
    带有:html标签,并同时,有双引号、单引号等:
    _T("<font color='#ff0000'>这是红色的字,而且还有双引号:\",还有单引号:'</font>")
    或是单引号的写法:
    _T('<font color="#ff0000">这是红色的字,而且还有双引号:\',还有单引号:"</font>')
      

  2.   

     string str=@"_T(""_T(_T('测试'))"")";                str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//
                    //\"_T(_T('测试'))\"
      

  3.   


     string str=@"_T(""_T(_T('测试'))"")";                   str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//                 //\"_T(_T('测试'))\"
      

  4.   


    谢谢您的回复:我使用您写的正则后,匹配出来的,会把一些连续的_T("xxx")文件信息也配置进去了:结果如下:
    "\"这是带有\"号的字符串内容,不可以配置,但我也想配置\")_T('这是带有'号字符串内容,不可以配置,但我也想配置')_T(\"这是没有带双引号,并使用双引号引起来的字符串内容,可以匹配\")_T('这是没有带单引号,并使用单引号引起来的字符串内容,可以匹配')_T(\"test3\")_T(\"test3\")_T(\"test3\")\n(\"tes\n_T('test5')\nt\n_T(\"test6\")\n4\""但正确结果应该是:
    _T(\"这是带有\"号的字符串内容,不可以配置,但我也想配置\")
    中的
    这是带有\"号的字符串内容,不可以配置,但我也想配置总结说明:假设:string txt = "_T(\"123\")_T(\"321\")";配置结果应该会有两个:
    1、123
    2、321但是您的匹配后,会得到:123")_T("321
      

  5.   


    using System.Collections.Generic;
    using System.Text.RegularExpressions;
    using System.Windows;
    using System.Windows.Documents;namespace RegexpTestingProject
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private const string p1 = "_T\\(\"(.*)\"\\)";
            private const string p2 = "(_T\\('([^\\('\\)]+)'\\))|(_T\\(\"([^\\(\"\\)]+)\"\\))";
            private const string p3 = @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)"; // p3与p4结果一样
            private const string p4 = "(?<=_T\\().*?(?=\\))";        private Regex r1;
            private Regex r2;
            private Regex r3;
            private Regex r4;        public List<Regex> rs;        public MainWindow()
            {
                InitializeComponent();
                this.textBox1.Text = "_T(\"123\")\n_T(\"321\")";
                this.btn1.Click += btn1_Click;            r1 = new Regex(p1);
                r2 = new Regex(p2, RegexOptions.Multiline);
                r3 = new Regex(p3, RegexOptions.Multiline);
                r4 = new Regex(p3, RegexOptions.Multiline);            rs = new List<Regex>(new Regex[] {
                    //r1,
                    //r2
                    //r3
                    r4
                });
            }        void btn1_Click(object sender, RoutedEventArgs e)
            {
                string txt = this.textBox1.Text;            List<string> result = pickUpAllLanguageStr(txt);
                string reusltStr = string.Empty;
                foreach (var item in result)
                {
                    reusltStr += "\t" + item + "\n";
                }            MessageBox.Show("\npick up result : " + reusltStr); // p3,p4结果:resultStr = "\t\"123\")\n_T(\"321\"\n"
                // 如果我使用我的p2,还是可以匹配到:123,321两个
            }        public List<string> pickUpAllLanguageStr(string inputTxt)
            {
                List<string> result = new List<string>();
                foreach (var r in rs)
                {
                    MatchCollection mc = r.Matches(inputTxt);
                    for (int i = 0; i < mc.Count; i++)
                    {
                        var g1 = mc[i].Groups[1].Value;
                        if (string.IsNullOrEmpty(g1))
                        {
                            g1 = mc[i].Groups[4].Value;
                        }
                        if (string.IsNullOrEmpty(g1))
                        {
                            continue;
                        }
                        if (!result.Contains(g1))
                        {
                            result.Add(g1);
                        }
                    }
                }
                return result;
            }
        }
    }
      

  6.   


    string txt = "_T(\"123\")\n_T(\"321\")"的时候:与1楼Return_false的效果一样