2016-04-27 113 views
2

从我读到的内容来看,如果我想捕获特定的单词,我可以使用单词边界。正则表达式边界混淆

我有以下信息

First: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key1 Key2 Key3 Key4 
Second: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key5 Key3 Key6 
Third: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key7 Key6 

我用下面的正则表达式,当我需要匹配Key3 Key4 Key6 Key7

(?<=#\d{4}\s)(\b(Key3|Key4|Key6|Key7)\b) 
+1

你在做什么,如果它只是不#'后跟随1234' – rock321987

+0

感谢我刚才注意到,以及更新将不会与任何关键字匹配。感谢这篇文章 – JeremyA1

回答

1

的问题是,你的正则表达式不允许# +4数字与您感兴趣的键之间的任何内容。您可以通过将可选(?:\s+\w+)*模式添加到后视图中来轻松修复该模式,该模式将匹配0个或更多1个空格和1个以上单词字符的序列:

(?<=#\d{4}(?:\s+\w+)*)\s*\b(Key3|Key4|Key6|Key7)\b 
      ^^^^^^^^^^^ 

查看regex demo,用C#中的逐字串字面值声明(或在VB.NET中原样使用)并与Regex.Matches一起使用。

一个C# demo

var strs = new List<string> { "First: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key1 Key2 Key3 Key4", 
"Second: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key5 Key3 Key6", 
"Third: 12345Z Apr 16 Something WORD: ABC Notification #1234 Key7 Key6"}; 
foreach (var s in strs) { 
    var result = Regex.Matches(s, @"(?<=#\d{4}(?:\s+\w+)*)\s*\b(Key3|Key4|Key6|Key7)\b") 
     .Cast<Match>() 
     .Select(m => m.Value) 
     .ToList(); 
    foreach (var e in result) 
     Console.WriteLine(e); 
} 
1

试试这个

(?:#\d{4}|\G)\s(\b(?:Key3|Key4|Key6|Key7)\b) 

Regex demo它只会匹配Key7

或该

(?:#\d{4}|\G) \b(?:(Key3|Key4|Key6|Key7)|\w+)\b 

Regex demo

说明:
(?: …):非捕获组sample
\:转义特殊字符sample
|:轮换/ OR操作数sample
\G:“空白字符”:字符串或上一个匹配的sample
\s终结的开始空格,制表符,换行符,回车,垂直制表sample
(…):捕获组sample