我有这样的文字:
my text has $1 per Lap to someone.
有人能告诉我如何从中挑选per
部分。我知道如何选择$
金额。就像这样:
new Regex(@"\$\d+(?:\.\d+)?").Match(s.Comment1).Groups[0].ToString()
任何帮助都将受到高度赞赏。
答案 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;
输出:
捕获per
的正则表达式为\p{L}+
,其中\p{L}
捕获所有Unicode字母(例如ф
,ё
),而不仅仅是拉丁文字。
要获取数字部分,请使用相同的正则表达式,但请抓取Groups[1].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;
如果您只需要在$
之后输入一个数字,只需将其后的开头圆括号放在正则表达式中:@"\$(\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();
修改强>
如果您只想在号码后面跟per
匹配,可以使用@"(\$\d+(?:\.\d+)?)\s*(per)"
或(不区分大小写)@"(\$\d+(?:\.\d+)?)\s*((?i:per\b))"
答案 1 :(得分:1)
正如你所说,per
是一个字符串类型,以下简单的正则表达式可以为你完成这项任务:
\$\d+\s([a-zA-Z]+)
但如果per
包含数字,您可以使用与字词匹配的\w
:
\$\d+\s(\w+)
注意在这种情况下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 }