我需要一个正则表达式来匹配字符串,但要从字符串中排除特定的单词。 例如
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
答案 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]+
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);
}
}
}
jex.im可视化正则表达式: