正则表达式选择一个单词的一部分

时间:2015-05-06 07:30:50

标签: c# regex

我有这样的文字:

my text has $1 per Lap to someone. 

有人能告诉我如何从中挑选per部分。我知道如何选择$金额。就像这样:

new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToString()

任何帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

如果你需要在一个更大的字符串中有多个子字符串,你可以使用捕获组。

要获取per部分,请使用以下正则表达式并抓住Groups[2].Value

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;

输出:

enter image description here

捕获per的正则表达式为\p{L}+,其中\p{L}捕获所有Unicode字母(例如фё),而不仅仅是拉丁文字。

要获取数字部分,请使用相同的正则表达式,但请抓取Groups[1].Value

var num_str = new Regex(@"(\$\d+(?:\.\d+)?)\s*(\p{L}+)").Match(str).Groups[1].Value;

输出:

enter image description here

另一个提示首先编译你的正则表达式如果你计划在你的应用执行期间多次使用它

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;

如果您只需要在$之后输入一个数字,只需将其后的开头圆括号放在正则表达式中:@"\$(\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();

enter image description here

修改

如果您只想在号码后面跟per匹配,可以使用@"(\$\d+(?:\.\d+)?)\s*(per)"或(不区分大小写)@"(\$\d+(?:\.\d+)?)\s*((?i:per\b))"

答案 1 :(得分:1)

正如你所说,per是一个字符串类型,以下简单的正则表达式可以为你完成这项任务:

\$\d+\s([a-zA-Z]+)

但如果per包含数字,您可以使用与字词匹配的\w

\$\d+\s(\w+)

Demo

注意在这种情况下per位于第一个捕获组中,您需要提取第一个组。

如果您不想使用grouping

,也可以使用积极的外观
(?<=\$\d+\s)[a-zA-Z]+

如果per是一个特殊字,您可以使用以下正则表达式进行检查:

(?<=\$\d+\s)per

类似的东西:

var per_str = new Regex(@'(?<=\$\d+\s)per').Match(str).Groups[0].Value;
if (per_str != ''){
#dostuff
}

答案 2 :(得分:0)

(?<=\$\d+(?:\.\d+)?\s+)\S+

这应该为你做。

答案 3 :(得分:0)

正如@Sayse所说,你在这里不需要正则表达式。我没有做过两个解决方案。

检查Demo或阅读代码:

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 }