需求:编写C#正则表达式提取指定字段对应值
字段值提取正则优化方案
需求说明
需要从文本中提取以下三个字段的值:
- CustomerID
- Amount
- order id
三个待提取的示例文本如下:
示例文本1
CustomerID: B377JWIWV10LEX Amount: Rs.1500 order id : 604-1343456290402730 Reason: Customer tried making a payment for 1500 via UPI
示例文本2
CustomerID : B377JWIWV10LEX AmOunt: 1500 order id : 604-1343456290402730 424 Reason: Customer tried making a payment for 1500 via UPI
示例文本3
CustomerID # B377JWIWV10LEX AmOunt: 1500 order id : 6041343456290402730424 Reason: Customer tried making a payment for 1500 via UPI
原正则问题分析
你之前使用的正则逻辑混乱,导致提取不准确:
- 硬编码
Rs.相关前缀,干扰了CustomerID、order id这类无Rs前缀字段的匹配 - 预查部分
(No|#|id|:|-|\s)*匹配范围过宽,会捕获多余字符,导致值的起始位置错误 - 末尾
(.*)(?!\n)*属于冗余写法,.*在单行模式下已能匹配到行尾
优化后的正则方案
针对每个字段的特点,分别编写精准正则,支持大小写不敏感匹配、多种分隔符(:/#)、前后空格兼容:
1. CustomerID提取正则
(?i)^CustomerID\s*[:#]\s*(.*)$
(?i):忽略大小写^CustomerID:匹配行首的字段名\s*[:#]\s*:匹配分隔符(:或#),前后允许任意空格(.*)$:捕获分隔符后到行尾的所有内容(自动忽略开头空格)
2. Amount提取正则
如果需要保留Rs.前缀:
(?i)^Amount\s*[:#]\s*(.*)$
如果仅需提取数值:
(?i)^Amount\s*[:#]\s*(?:Rs\.?\s*)?(.*)$
(?:Rs\.?\s*)?:可选匹配Rs./Rs前缀,不捕获该部分(.*):捕获后续的数值内容
3. order id提取正则
(?i)^order id\s*[:#]\s*(.*)$
逻辑同CustomerID,适配字段名的空格分隔写法
提取效果验证
用优化后的正则提取三个示例文本,结果如下:
- 示例1
- CustomerID:
B377JWIWV10LEX - Amount:
Rs.1500(或数值1500) - order id:
604-1343456290402730
- CustomerID:
- 示例2
- CustomerID:
B377JWIWV10LEX - Amount:
1500 - order id:
604-1343456290402730 424
- CustomerID:
- 示例3
- CustomerID:
B377JWIWV10LEX - Amount:
1500 - order id:
6041343456290402730424
- CustomerID:
批量提取代码示例(Python)
import re # 定义字段与对应正则 field_patterns = { "CustomerID": r"(?i)^CustomerID\s*[:#]\s*(.*)$", "Amount": r"(?i)^Amount\s*[:#]\s*(.*)$", # 保留Rs前缀的版本 "order id": r"(?i)^order id\s*[:#]\s*(.*)$" } # 三个示例文本 samples = [ """CustomerID: B377JWIWV10LEX Amount: Rs.1500 order id : 604-1343456290402730 Reason: Customer tried making a payment for 1500 via UPI""", """CustomerID : B377JWIWV10LEX AmOunt: 1500 order id : 604-1343456290402730 424 Reason: Customer tried making a payment for 1500 via UPI""", """CustomerID # B377JWIWV10LEX AmOunt: 1500 order id : 6041343456290402730424 Reason: Customer tried making a payment for 1500 via UPI""" ] # 批量提取并输出 for i, sample in enumerate(samples, 1): print(f"=== 示例文本{i}提取结果 ===") lines = sample.splitlines() for field, pattern in field_patterns.items(): for line in lines: match = re.match(pattern, line) if match: print(f"{field}: {match.group(1).strip()}") break print()
内容的提问来源于stack exchange,提问作者Shrayus
相关产品推荐
相关产品推荐

