过滤完整字符串匹配但不过滤子字符串

Filtering on full string match but not on substrings

所以我有一长串数字和字符,我想过滤掉一个子串。我正在努力解决的问题是我需要对某个值(从 S 开始)进行完全匹配,但这可能与另一个值不匹配。

输入:

S10     1+0000000297472+00EURS100    1+0000000297472+00EURS1023P  1+0000000816072+00EUR

输入完全是这样。

输入细分:

S10     1+0000000297472+00EUR

=>

我需要在例如 S10 上进行匹配,并且我只想要此子字符串直到 EUR。我不希望它与 S100 或 S1023P 或任何其他组合匹配。仅在 S10

输出:

S10     1+0000000297472+00EUR

我正在尝试使用 Regex 在 'S + code' 上找到我的匹配项。我正在对我的搜索查询进行完全匹配,然后一旦出现任何内容,我就不再需要它了。但是这样做也会丢弃实际匹配,因为在 S10 之后,值将跟随它将匹配 [^\d|^\D])+\w

 foreach (var field in fieldList)
 {
     var query = "S" + field.BallanceCode;                                
     var index = Regex.Match(values, Regex.Escape(query) + @"([^\d|^\D])+\w").Index;
 }

例如寻找S10

需要匹配:

S10 1+0000000297472+00EUR

可能不匹配:

S10/15  1+0000001748447+00EUR 
S1023P  1+0000000816072+00EUR
S10000001+0000000546546+00EUR

更新:

使用此代码

var index = Regex.Match(values, Regex.Escape(query) + @"\p{Zs}.*?EUR").Index; 

will yield S10, S10/15, etc will yield when looked for.但是在字符串中查找 S1000000 不起作用,因为代码和 1+

之间没有空格

S10000001+0000000546546+00EUR

例如在查找 S1000000 时

需要匹配:

S10000001+0000000297472+00EUR

可能不匹配:

S10     1+0000001748447+00EUR 
S1023P  1+0000000816072+00EUR
S10/15  1+0000000546546+00EUR

所以您只需要每行的开始 (S...) 和结束 (...EUR) 并跳过中间的所有内容?

^([sS]\d+).*?([\d\+]+EUR)$

http://regexr.com/3c1ob

您可以使用需要 space(或白色 space)紧跟在 field.BallanceCode:

之后的正则表达式
var index = Regex.Match(values, Regex.Escape(query) + (field.BallanceCode.Length < 7 ? @"\p{Zs}" : "") + ".*?EUR").Index;

正则表达式将匹配 S10,然后是任何水平的白色 space (\p{Zs}),然后是除换行符以外的任何 0 个或多个字符(由于*?) 到第一个 EUR.

(field.BallanceCode.Length < 7 ? @"\p{Zs}" : "") 检查是支持 7 位数字 BallanceCode 所必需的。如果它包含 7 位或更多,我们不检查它后面是否有白色space。如果长度小于 7,我们检查 space.