我有这样的文件名:
0296005_PH3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS.
我需要将名称分解为由下划线分隔的组。我这样做了:
(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
到目前为止。
现在我需要从组中的一个中提取字符,例如在组2中我需要前三个和第八个小数(请记住它们也可能是字符)。
所以我尝试过这样的事情:
(.*?)_([38]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
它不起作用,但如果我这样做:
(.*?)_([PH]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
它会将 PH 拉入群组但不会 38 ?所以我现在迷失了。
任何帮助都会很棒
答案 0 :(得分:1)
(?)_([A-Z0-9] {3} [0-9] {1})(。?)的(。*?)(?)_(。?)的(。*?)(?)_(。?)
(?)_([A-Z0-9] {3} [A-Z0-9] {1})(。?)的(。*?)< /em>(.?)_(.?)(.*?)(.?)_(.?)
它将匹配任意3个字母/数字,后跟1个字母/数字。
(?)_([PH] + [0-9A-Z] {2})(。?)的(。*?)(< EM>?)_(。?)的(。*?)(?)_(。?)
答案 1 :(得分:0)
我假设你试图从数字开始匹配group2。如果是这种情况,那么您已经更改了源字符串,例如
0296005_的 38 强> 3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS。
查看答案 2 :(得分:0)
使用[^_]*
在您的情况下比.*?
执行得更好,因为它不会回溯。所以改变你原来的正则表达式:
(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
为:
([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
将给定字符串的步数从114减少到42。
最好的方法可能是在_
上实际拆分字符串,然后测试第二个元素以查看它是否包含38
。由于您尚未指定某种语言,因此我无法帮助您了解您的语言,但大多数语言都使用contains
或indexOf
方法来确定是否使用字符串中不存在子字符串。
然而,单独使用正则表达式,可以使用以下正则表达式完成此操作。
确保第二部分中存在38
:
([^_]*)_([^_]*38[^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
在第二部分中捕捉38
:
([^_]*)_([^_]*)(38)([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)