匹配字符串但不匹配特定单词

时间:2019-06-18 14:25:17

标签: c# .net regex

我需要一个正则表达式来匹配字符串,但要从字符串中排除特定的单词。 例如

dfm HSBC12323 

我需要提取

HSBC12323 

,并且不包括dfm。如果字符串HSBC12323需要按原样进行匹配,因为dfm可能不存在。

如果字符串dfm123213我需要匹配123213 adx 212321我需要匹配212321而不是adx adx hsbc123uy我需要匹配hsbc123uy hsbc1237我需要按原样进行匹配。

(?<!dfm\s*?|adx\s*?|\w)\d+

但是它不像我想要的那样工作

Actual string : dfm HSBC12323  excpected HSBC12323 
Actual string : HSBC12323  expected HSBC12323 
Actual string : dfm123213 expected 123213
Actual string : adx 212321 expected 212321 
Actual string : usa1237 expected usa1237

2 个答案:

答案 0 :(得分:0)

如果左侧的字符不是dfm或adx或单词字符,则您的模式(?<!dfm\s*?|adx\s*?|\w)\d+会匹配1个以上的数字,其中前两个字符后可以有空格字符。您不必使s*?变得不贪婪,因为它无法通过与以下数字\d+匹配的

在所有不匹配的示例中,因为前两个示例不匹配时,所有示例\w之前可以匹配一个数字。例如$22将匹配。

一种与您的值匹配的选项可以是交替使用正向后看和负向后看。

(?<=\b(?:dfm|adx) *)\w+|\b(?!(?:dfm|adx))\w+

说明

  • (?<=向后看,断言左边是什么
    • \b(?:dfm|adx) *字边界,匹配dfm或adx,后跟0+倍的空格
  • )往后看积极
  • \w+匹配1个以上的字符字符
  • |
  • \b字边界
  • (?!负向查找,断言直接在右边的不是
    • (?:dfm|adx)匹配dfm或adx
  • )近距离否定预测
  • \w+匹配1个以上的单词字符

查看.NET regex demo

如果匹配项后不应该包含非空白字符,则还可以在匹配(?!\S)之后添加\w+

答案 1 :(得分:0)

我的猜测是,使用此表达式或类似的表达式,我们可以逐步捕获我们想要的内容,然后甚至为了安全起见,甚至可以通过附加约束来增强我们的表达式:

(?=dfm\s+|adx\s+)(?:dfm\s+([A-Z0-9]+)|adx\s+([0-9]+))|(?=dfm)dfm([0-9]+)|[A-Za-z0-9]+

Demo

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"(?=dfm\s+|adx\s+)(?:dfm\s+([A-Z0-9]+)|adx\s+([0-9]+))|(?=dfm)dfm([0-9]+)|[A-Za-z0-9]+";
        string input = @"dfm HSBC12323
HSBC12323
dfm123213
adx 212321
usa1237";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

RegEx电路

jex.im可视化正则表达式:

enter image description here