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

时间:2015-10-22 09:17:19

标签: c# regex string expression

所以我有一长串数字和字符,我想过滤掉一个子字符串。我挣扎的是我需要一个特定值的完全匹配(从S开始),但这可能与另一个值不匹配。

输入:

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

输入就是这样。

输入细分:

S10     1+0000000297472+00EUR
  • 每个部分都以标记S开头,以EUR
  • 结尾
  • 中间有空格,因为每个部分都有固定的长度

=>

  • 索引0:标记' S'长度为1
  • 索引1:长度为7的代码
  • 索引8:长度为1的numbertype
  • 索引9:长度为1的符号
  • 索引10:长度为13的值
  • 索引23:长度为1的标志
  • 索引24:指数长度为2
  • 索引26:长度为3的单位

我需要匹配例如S10,我只希望这个子字符串直到EUR。我不希望它在S100或S1023P或任何其他组合上匹配。仅限于S10

输出:

S10     1+0000000297472+00EUR

我尝试使用Regex在' S +代码'上找到我的匹配项。我正在对我的搜索查询进行完全匹配,然后只要有任何后续内容我就不再需要它了。但是这样做也会丢弃实际的匹配,因为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; 
当寻找时,将产生S10,S10 / 15等。但是在字符串中查找S1000000并不起作用,因为代码和1 +之间没有空格

S1000000 1 + 0000000546546 + 00EUR

例如,在寻找S1000000

需要匹配:

S10000001+0000000297472+00EUR

可能不匹配:

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

2 个答案:

答案 0 :(得分:1)

您可以使用需要空格(或空格)的正则表达式出现在field.BallanceCode之后:

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

正则表达式将匹配S10,然后是任何水平空格(\p{Zs}),然后是换行符以外的任何0个或更多字符(由*?引起的尽可能少)到第一个EUR

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

答案 1 :(得分:0)

所以你只想要每行的开始(S ...)和结束(... EUR)并跳过它们之间的所有内容?

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

http://regexr.com/3c1ob