C# 正则表达式来选择单词的一部分
我有这样一个文本:C# 正则表达式来选择单词的一部分,c#,regex,C#,Regex,我有这样一个文本: my text has $1 per Lap to someone. new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToString() 谁能告诉我如何从中挑选每个零件的。我知道如何选择$金额。是这样的: my text has $1 per Lap to someone. new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToSt
my text has $1 per Lap to someone.
new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToString()
谁能告诉我如何从中挑选每个零件的。我知道如何选择$
金额。是这样的:
my text has $1 per Lap to someone.
new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToString()
非常感谢您的帮助。(?正如您所说的per
是一种字符串类型,下面的简单正则表达式可以为您完成这项工作:
(?<=\$\d+(?:\.\d+)?\s+)\S+
\$\d+\s([a-zA-Z]+)
但是,如果每个都包含数字,则可以使用与单词字符匹配的\w
:
\$\d+\s(\w+)
请注意,在这种情况下,per
位于第一个捕获组中,您需要提取第一个组
如果您不想使用分组,您也可以使用正面的后视:
(?<=\$\d+\s)[a-zA-Z]+
比如:
var per_str = new Regex(@'(?<=\$\d+\s)per').Match(str).Groups[0].Value;
if (per_str != ''){
#dostuff
}
var per_str=new Regex(@'(?如果在一个较大的字符串中需要多个子字符串,可以使用捕获组
要获得每个
部分的,请使用以下正则表达式并获取组[2]。值
:
var str = "my text has $1 per Lap to someone. ";
var per_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[2].Value;
var num_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[1].Value;
输出:
每个
捕获的正则表达式是\p{L}+
,其中\p{L}
捕获所有Unicode字母(例如ф
,ё
),而不仅仅是拉丁字母
要获取数字部分,请使用相同的正则表达式,但要抓取组[1]。值:
var str = "my text has $1 per Lap to someone. ";
var per_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[2].Value;
var num_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[1].Value;
输出:
还有另一个提示:如果您计划在应用程序执行期间多次使用正则表达式,请首先编译正则表达式:
var rx = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)", RegexOptions.Compiled);
var per_str = rx.Match(str).Groups[2].Value;
var num_str = rx.Match(str).Groups[1].Value;
如果在$
之后只需要一个数字,只需在regex:@“\$(\d+(?:\.\d+)?)\s*(\p{L}+)”
中的后面放一个圆括号即可
要使所有组都在一个围棋中,您可以使用
var groups = rx.Matches(str).Cast<Match>().Select(p => new { num = p.Groups[1].Value, per = p.Groups[2].Value }).ToList();
var groups=rx.Matches(str.Cast().Select(p=>new{num=p.groups[1].Value,per=p.groups[2].Value}.ToList();
编辑:
如果您只想在数字后匹配per
,您可以使用@(\$\d+(?:\.\d+))\s*(per)
或(不区分大小写)@(\$\d+(?:\.\d+)\s*(?i:per\b))”
正如@Sayse所说的,这里不需要正则表达式。我提出了两个解决方案
检查或读取代码:
public static void Main()
{
var s = "my text has $1 per Lap to someone.";
Console.WriteLine(Test(s));
Console.WriteLine(Test2(s));
}
static object Test(string s)
{
var tab = s.Remove(s.IndexOf(" Lap")) // remove everything after " Lap"
.Substring(s.IndexOf(" $") + 2) // remove everything before " $"
.Split(' ');
return new { Amount = tab[0], Per = tab[1] };
}
static object Test2(string s)
{
var tab = s.Split(' ');
var amount = tab.Single(t => t.StartsWith("$")).Substring(1);
var per = tab[Array.FindIndex(tab, t => t.StartsWith("$")) + 1];
return new { Amount = amount, Per = per };
}
输出
{ Amount = 1, Per = per }
{ Amount = 1, Per = per }
澄清一下:你想匹配$
,一个数字,每
和一个单词;捕获数字和单词?每
的类型是什么?@Kasra它只是一个字符串类型。@Richard Nope,我只需要选择或检查上面的文本中是否有每
部分。然后这样做,你不需要在我看到的演示中使用regexOn它会同时选择$
和每个部分。但我只需要选择每个部分。@Sampath是的,这是整个匹配,因为您使用捕获分组,您需要提取第一个组。匹配(s.Comment1)。组[1]
我使用了另一种方式。但它不仅选择了每
其他人。它是这样的。假设我有一个这样的文本我的文本要圈给某人一美元。
。然后它选择到
。我如何避免选择其他人?提前谢谢。@Sampath那么你想要圈
还是其他人
?不,我只需要检查上面的文本是否只包含每个
部分。其他人不应该选择。谢谢。但它不仅选择每个
其他人。它是这样的。假设我有这样一个文本,我的文本有1美元要交给某人。
。然后它选择到
。我如何避免选择其他人?提前谢谢。使用文字“per”:@(\$\d+(?:\.\d+))\s*(per)\b“
。但是,我不认为捕获组有什么意义,因为您知道它是“per”。除非它可以是小写或大写。然后,使用@(\$\d+(?:\.\d+)\s*(?I:per)\b)
。非常感谢您的支持:)是的,正如我所说的,我们有无数行。在测试()
,只有2行,如果直接返回数组选项卡
,则只能在一行中完成。