簡體   English   中英

正則表達式在第二次出現下划線后匹配下划線之間的單詞

[英]Regex to match words between underscores after second occurence of underscore

所以我想在下划線第二次出現后在下划線之間添加單詞

這是我的字符串

ABC_BC_BE08_C1000004_0124

我已經組裝了這個表達式

(?<=_)[^_]+

很好,它符合我的需要,但只跳過第一個詞,因為它前面沒有下划線。 我希望它跳過 ABC 和 BC,只獲取最后三個字符串,我試過亂搞,但我被卡住了,無法讓它工作。 謝謝!

您可以在此處使用SplitSkip的非正則表達式方法:

var text = "ABC_BC_BE08_C1000004_0124";
var result = text.Split('_').Skip(2);
foreach (var s in result)
    Console.WriteLine(s);

Output:

BE08
C1000004
0124

請參閱C# 演示

使用正則表達式,您可以使用

var result = Regex.Matches(text, @"(?<=^(?:[^_]*_){2,})[^_]+").Cast<Match>().Select(x => x.Value);

請參閱正則表達式演示C# 演示 正則表達式匹配

  • (?<=^(?:[^_]*_){2,}) - 正向后視匹配與當前位置左側緊鄰的以下模式匹配的位置:
    • ^ - 字符串的開始
    • (?:[^_]*_){2,} - 兩個或多個 ( {2,} ) 序列,除了_ ( [^_]* ) 之外的任何零個或多個字符,然后是一個_字符
  • [^_]+ - _以外的一個或多個字符

Usign .NET 還有一個捕獲集合,您可以將其與正則表達式和重復的 catpure 組一起使用。

^[^_]*_[^_]*(?:_([^_]+))+

模式匹配:

  • ^字符串開始
  • [^_]*_[^_]*匹配除_之外的任何字符,匹配_並再次匹配除_之外的任何字符
  • (?:非捕獲組
    • _([^_]+)匹配_並捕獲第 1中除_以外的任何字符 1 次或多次
  • )+關閉非捕獲組,重復1次或多次

.NET 正則表達式演示| C#演示

例如:

var pattern = @"^[^_]*_[^_]*(?:_([^_]+))+";
var str = "ABC_BC_BE08_C1000004_0124";
var strings = Regex.Match(str, pattern).Groups[1].Captures.Select(c => c.Value);

foreach (String s in strings)
{
    Console.WriteLine(s);
}

Output

BE08
C1000004
0124

在此處輸入圖像描述

如果只想匹配下划線之間的單詞字符,模式的另一個選項可能是使用否定字符 class [^\W_]從單詞字符中排除下划線:

^[^\W_]*_[^\W_]*(?:_([^\W_]+))+

暫無
暫無

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

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