过滤完整字符串匹配但不过滤子字符串
Filtering on full string match but not on substrings
所以我有一长串数字和字符,我想过滤掉一个子串。我正在努力解决的问题是我需要对某个值(从 S 开始)进行完全匹配,但这可能与另一个值不匹配。
输入:
S10 1+0000000297472+00EURS100 1+0000000297472+00EURS1023P 1+0000000816072+00EUR
输入完全是这样。
输入细分:
S10 1+0000000297472+00EUR
- 每个部分都以标签 S 开头,以 EUR 结尾
- 中间有空格,因为每一部分都有固定的长度
=>
- 索引 0 : 标签 'S' 长度为 1
- 索引 1 : 长度为 7 的代码
- 索引 8 : 长度为 1 的数字类型
- index 9 : 符号长度为 1
- 索引 10 : 长度为 13 的值
- index 23 : 符号长度为 1
- 索引 24:长度为 2 的指数
- 索引 26:长度为 3 的单元
我需要在例如 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)$
您可以使用需要 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.
所以我有一长串数字和字符,我想过滤掉一个子串。我正在努力解决的问题是我需要对某个值(从 S 开始)进行完全匹配,但这可能与另一个值不匹配。
输入:
S10 1+0000000297472+00EURS100 1+0000000297472+00EURS1023P 1+0000000816072+00EUR
输入完全是这样。
输入细分:
S10 1+0000000297472+00EUR
- 每个部分都以标签 S 开头,以 EUR 结尾
- 中间有空格,因为每一部分都有固定的长度
=>
- 索引 0 : 标签 'S' 长度为 1
- 索引 1 : 长度为 7 的代码
- 索引 8 : 长度为 1 的数字类型
- index 9 : 符号长度为 1
- 索引 10 : 长度为 13 的值
- index 23 : 符号长度为 1
- 索引 24:长度为 2 的指数
- 索引 26:长度为 3 的单元
我需要在例如 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)$
您可以使用需要 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.