簡體   English   中英

正則表達式選擇一個單詞的一部分

[英]Regex to pick a part of a word

我有這樣的文字:

my text has $1 per Lap to someone. 

誰能告訴我如何從中挑選per部分。 我知道如何選擇$金額。 就像這樣:

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

任何幫助將受到高度贊賞。

如果您需要在更大的字符串中使用多個子字符串,則可以使用捕獲組。

要獲取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))"

正如你所說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
}
(?<=\$\d+(?:\.\d+)?\s+)\S+

這應該為你做。

正如@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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM