我的目标是将字符串分成几组。问题是当前的正则表达式无法正确识别该部分。
正则表达式:
^(?: {2,})?(?P<TANGGAL>[0-9]{2}/[0-9]{2}){0,1}(?: {2,})?(?P<KETERANGAN1>[w-/:]+(?: [w-/:]+)*){0,1}(?: {2,})?(?P<KETERANGAN2>[w-/:]+(?: [w-/:]+)*){0,1}(?: {2})?(?P<SALDO>[d,.]+){0,1}
字符串:
01/07 SALDO AWAL 1,000.00
问题: 正则表达式捕获:
- 字符串
1,000.00
1
为组KETERANGAN2
而不是组SALDO
。 ,000.00
为组SALDO
,而不是捕获整个1,000.00
。
您可以将可选的捕获组更改为必需的,并将它们移动到与列分隔符匹配的可选非捕获组中:
^(?: {2,}(?P<TANGGAL>[0-9]{2}/[0-9]{2}))?(?: {2,}(?P<KETERANGAN1>[w/:-]+(?: [w/:-]+)*))?(?: {2,}(?P<KETERANGAN2>[w/:-]+(?: [w/:-]+)*))?(?: {2,}(?P<SALDO>[d,.]+))?$
请参阅正则表达式演示。
注意添加的$
字符串锚点的末尾,有必要确保整行匹配。
详情:
^
- 字符串的开头(?: {2,}(?P<TANGGAL>[0-9]{2}/[0-9]{2}))?
- 一个可选的非捕获组,匹配两个或多个空格,然后捕获到组"TANGGAL"两位数,/
,两位数(?: {2,}(?P<KETERANGAN1>[w/:-]+(?: [w/:-]+)*))?
- 一个可选的非捕获组,匹配两个或多个空格,然后捕获到组"KETERANGAN1"一个或多个单词、/
、:
或-
字符,然后是空格的零个或多个序列,然后是一个或多个单词、/
、:
、-
字符(?: {2,}(?P<KETERANGAN2>[w/:-]+(?: [w/:-]+)*))?
- 一个可选的非捕获组,匹配两个或多个空格,然后将一个或多个单词、/
、:
或-
字符捕获到组"KETERANGAN2"中,然后捕获一个或多个空格序列,然后捕获一个或多个单词、/
、:
、-
字符(?: {2,}(?P<SALDO>[d,.]+))?
- 匹配两个或多个空格的可选非捕获组,然后将一个或多个数字、,
或.
字符捕获到组"SALDO"中$
- 字符串的结尾。