这个 C# 正则表达式怎么写呢?

Jave.Lin 2013-11-05 04:57:10
我想获取_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;
}
}
}



运行结果,截图:
...全文
316 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jave.Lin 2013-11-05
  • 打赏
  • 举报
回复
引用 3 楼 Lost_Painting 的回复:

(?<=_T\().*?(?=\))
string txt = "_T(\"123\")\n_T(\"321\")"的时候:与1楼Return_false的效果一样
Jave.Lin 2013-11-05
  • 打赏
  • 举报
回复

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;
        }
    }
}

Jave.Lin 2013-11-05
  • 打赏
  • 举报
回复
引用 2 楼 Return_false 的回复:
 string str=@"_T(""_T(_T('测试'))"")";

                str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//
                //\"_T(_T('测试'))\"
谢谢您的回复: 我使用您写的正则后,匹配出来的,会把一些连续的_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
enaking 2013-11-05
  • 打赏
  • 举报
回复

 string str=@"_T(""_T(_T('测试'))"")";                   str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//                 //\"_T(_T('测试'))\"
鸭梨山大帝 2013-11-05
  • 打赏
  • 举报
回复

(?<=_T\().*?(?=\))
  • 打赏
  • 举报
回复
 string str=@"_T(""_T(_T('测试'))"")";

                str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//
                //\"_T(_T('测试'))\"
Jave.Lin 2013-11-05
  • 打赏
  • 举报
回复
_T()内的字符串会相当丰富,几基础上什么情况都有可能,如: 带有:html标签,并同时,有双引号、单引号等:
_T("<font color='#ff0000'>这是红色的字,而且还有双引号:\",还有单引号:'</font>")
或是单引号的写法:
_T('<font color="#ff0000">这是红色的字,而且还有双引号:\',还有单引号:"</font>')

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧