正则表达式将字符串拆分为 char 但具有最大大小

Posted

技术标签:

【中文标题】正则表达式将字符串拆分为 char 但具有最大大小【英文标题】:Regex split string to char but with maximum size 【发布时间】:2018-12-05 00:19:23 【问题描述】:

我正在尝试在 C# 中构建一个正则表达式,以将我扫描的条形码与组(GS1 代码)匹配。 所以每个字段都有一个正则表达式来剪切流,但 FNC1 字符是字段的结尾,前面 1 到 30 位是值,但前 2 位是应用程序标识符。

简单示例:

var value = "9212345678\u00053302123456";
var regex = "((?<Field>([\d]2))(?<Value>(\d1,30$)).*?)(?<FNC1>[\x00-\x1f\x80-\xFF])";

Result:
Field -> 92
Value -> 12345678
FNC1 -> (char) 5

但是当值的大小超过 30 位数时,它仍然匹配,但不匹配 FNC1 分频器。 我尝试使用积极的前瞻,但它只是从价值组的末尾转过来匹配 30 位。

谁能告诉我我应该寻找的方向?

编辑: 为了澄清它: 该字段是我的字符串中的前 2 位,然后我有 1 到 30 位以 FNC1 符号终止(这里是字符 5,或者您可以说的任何不正常的东西)。如果值字符串是 33 位,它不应与正则表达式中的值匹配。

所以这个不应该匹配:

var value = "921234567890123456789012345678901\u00053302123456";

FNC1 分隔符后面的值如下代码,在本例中为“3302123456”。这将是来自扫描的真实示例。

【问题讨论】:

试试@"^(?&lt;Field&gt;\d2)(?&lt;Value&gt;\d+)(?&lt;FNC1&gt;[\x00-\x1f\x80-\xFF])" 请说明要求。 Field 是字符串开头的两位数,对吧?然后,任何 1 位以上的数字直到您称为 FNC1 的某个分隔符,对吗? FNC1 模式是[\x00-\x1f\x80-\xFF]?那么上面的建议就可以了。 哦,好的,我的问题中忘记提及基础知识了,抱歉。字段应该是 2 位,值在您已经知道的 FNC1 模式之间,但可以在 1 到 30 位之间,这就是我使用 1,30 的原因,但它的读数比应有的多。 见regexstorm.net/… 这是否按预期工作?您的匹配项是否出现在字符串的开头?如果不是,请将^ 替换为\b。或删除。 【参考方案1】:

你可以使用

^(?<Field>\d2)(?<Value>\d1,30)(?<FNC1>[\x00-\x1f\x80-\xFF])

见regex demo

详情

^ - 字符串开头 (?&lt;Field&gt;\d2) - 捕获组“字段”:两位数 (?&lt;Value&gt;\d1,30) - 捕获组“值”:一到三十位 (?&lt;FNC1&gt;[\x00-\x1f\x80-\xFF]) - 正在捕获组“FNC1”:字符类中指定范围的字符。

【讨论】:

以上是关于正则表达式将字符串拆分为 char 但具有最大大小的主要内容,如果未能解决你的问题,请参考以下文章

将文本拆分为选择

如何使用正则表达式提取骆驼大小写字符串的所有单词?

C ++拆分字符串基于/使用(增强)正则表达式来查找令牌

正则表达式匹配空间不以 char 开头/结尾

Python正则表达式拆分但保留某些字符以进行拆分

使用正则表达式将字符串拆分为句子