正则表达式从组中提取文本

时间:2018-02-07 16:15:46

标签: regex

我有这样的文件名:

 0296005_PH3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS.

我需要将名称分解为由下划线分隔的组。我这样做了:

(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)

到目前为止。

现在我需要从组中的一个中提取字符,例如在组2中我需要前三个和第八个小数(请记住它们也可能是字符)

所以我尝试过这样的事情:

 (.*?)_([38]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)

它不起作用,但如果我这样做:

(.*?)_([PH]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)

它会将 PH 拉入群组但不会 38 ?所以我现在迷失了。

任何帮助都会很棒

3 个答案:

答案 0 :(得分:1)

  1. 尝试使用以下正则表达式匹配任何前3个字符/小数和一个小数
  2.   

    ?)_([A-Z0-9] {3} [0-9] {1})(。?)的(。*?)?)_(。?)的(。*?)?)_(。?)

    1. 尝试使用以下正则表达式匹配任何前3个字符/小数和1个小数/字符
    2.   

      ?)_([A-Z0-9] {3} [A-Z0-9] {1})(。?)的(。*?)< /em>(.?)_(.?)(.*?)(.?)_(.?)

      它将匹配任意3个字母/数字,后跟1个字母/数字。

      1. 如果您的前两个字母是常数,例如&#34; PH &#34;然后尝试下面的
      2.   

        ?)_([PH] + [0-9A-Z] {2})(。?)的(。*?)(< EM>?)_(。?)的(。*?)?)_(。?)

答案 1 :(得分:0)

我假设你试图从数字开始匹配group2。如果是这种情况,那么您已经更改了源字符串,例如

0296005_的 38 3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS。

可行,请在https://regex101.com/r/zem3vt/1

查看

答案 2 :(得分:0)

使用[^_]*在您的情况下比.*?执行得更好,因为它不会回溯。所以改变你原来的正则表达式:

(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)

为:

([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)

将给定字符串的步数从114减少到42。

最好的方法可能是在_上实际拆分字符串,然后测试第二个元素以查看它是否包含38。由于您尚未指定某种语言,因此我无法帮助您了解您的语言,但大多数语言都使用containsindexOf方法来确定是否使用字符串中不存在子字符串。

然而,单独使用正则表达式,可以使用以下正则表达式完成此操作。

See regex in use here

确保第二部分中存在38

([^_]*)_([^_]*38[^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)

在第二部分中捕捉38

([^_]*)_([^_]*)(38)([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)