簡體   English   中英

從正則表達式僅返回部分匹配項

[英]Returning only part of match from Regular Expression

假設我的字符串“用戶名:firstname.surname”包含在一個較大的字符串中,如何使用正則表達式來獲取 firstname.surname 部分?

我嘗試過的每種方法都返回字符串“用戶名:firstname.surname”,然后我必須將“用戶名:”上的字符串替換為空字符串。

可以在這里使用反向引用嗎?

編輯:

較長的字符串可能包含“帳戶名稱:firstname.surname”,因此我想匹配字符串的“用戶名:”部分以獲得該值。

我喜歡使用命名組:

Match m = Regex.Match("User Name:first.sur", @"User Name:(?<name>\w+\.\w+)");
if(m.Success)
{
   string name = m.Groups["name"].Value;
}

?<something>放在括號中的組的開頭(例如(?<something>...) )允許您使用something作為鍵從匹配中獲取值(例如從m.Groups["something"].Value )

如果您不想 go 麻煩為您的組命名,您可以說

Match m = Regex.Match("User Name:first.sur", @"User Name:(\w+\.\w+)");
if(m.Success)
{
   string name = m.Groups[1].Value;
}

並得到第一個匹配的東西。 (請注意,第一個帶括號的組位於索引1處;匹配的整個表達式位於索引0處)

您也可以嘗試“環視”的概念。 這是一種零寬度斷言,這意味着它會匹配字符,但不會在結果中捕獲它們。

在您的情況下,我們可以積極地向后看:我們希望目標字符串“firstname.surname”后面的內容等於“User Name:”。

正向后視運算符:(?<=StringBehind)StringWeWant

這可以這樣實現,例如(一個小 Java 示例,使用字符串替換):

String test = "Account Name: firstname.surname; User Name:firstname.surname";
String regex = "(?<=User Name:)firstname.surname";
String replacement = "James.Bond";
System.out.println(test.replaceAll(regex, replacement));

這僅替換“用戶名:”前面的“名字.姓氏”字符串,而不替換“用戶名:”本身 - 正則表達式不返回,僅匹配。

OUTPUT:賬戶名:firstname.surname; 用戶名:James.Bond

也就是說,如果您使用的語言支持這種操作

用括號創建一個組,然后從Match.Groups集合中獲取它,如下所示:

string s = "User Name:firstname.surname";
Regex re = new Regex(@"User Name:(.*\..*)");
Match match = re.Match(s);
if (match.Success)
{
    MessageBox.Show(match.Groups[1].Value);
}

(注意:第一組,索引為 0,是整個匹配)

我使用的所有正則表達式庫都允許您使用括號在正則表達式中定義組,然后從結果中訪問該組。

因此,您的正則表達式可能如下所示: User name:([^.].[^.])

完全匹配是第 0 組。括號內匹配的部分是第 1 組。

暫無
暫無

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

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