正则表达式将字符串拆分为 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”。这将是来自扫描的真实示例。
【问题讨论】:
试试@"^(?<Field>\d2)(?<Value>\d+)(?<FNC1>[\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
详情
^
- 字符串开头
(?<Field>\d2)
- 捕获组“字段”:两位数
(?<Value>\d1,30)
- 捕获组“值”:一到三十位
(?<FNC1>[\x00-\x1f\x80-\xFF])
- 正在捕获组“FNC1”:字符类中指定范围的字符。
【讨论】:
以上是关于正则表达式将字符串拆分为 char 但具有最大大小的主要内容,如果未能解决你的问题,请参考以下文章