110,534
社区成员
发帖
与我相关
我的任务
分享
<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>
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;
}
}
}
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;
}
}
}
"\"这是带有\"号的字符串内容,不可以配置,但我也想配置\")_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
string str=@"_T(""_T(_T('测试'))"")"; str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;// //\"_T(_T('测试'))\"
(?<=_T\().*?(?=\))
string str=@"_T(""_T(_T('测试'))"")";
str = Regex.Match(str, @"(?i)_t\(((?<O>_t\()|(?<-O>\))|[\s\S]+)*(?(O)(?!))\)").Groups[1].Value;//
//\"_T(_T('测试'))\"
_T("<font color='#ff0000'>这是红色的字,而且还有双引号:\",还有单引号:'</font>")
或是单引号的写法:
_T('<font color="#ff0000">这是红色的字,而且还有双引号:\',还有单引号:"</font>')