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行,如果直接返回数组
选项卡
,则只能在一行中完成。