Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从组中提取文本的正则表达式_Regex - Fatal编程技术网

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

Regex 从组中提取文本的正则表达式,regex,Regex,我的文件名如下: 0296005_PH3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS. 我需要将名称分解为多个组,这些组之间用下划线分隔。我喜欢这样: (.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*) 到目前为止 现在我需要从其中一个组中提取字符,例如在第2组中,我需要前3和8位小数,请记住它们也可以是字符 所以我试过这样的方法: (.*?)_([

我的文件名如下:

 0296005_PH3843C5_SEQ_6210_QTY_BILLING_D_DEV_0000000000000183.PS.
我需要将名称分解为多个组,这些组之间用下划线分隔。我喜欢这样:

(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
到目前为止

现在我需要从其中一个组中提取字符,例如在第2组中,我需要前3和8位小数,请记住它们也可以是字符

所以我试过这样的方法:

 (.*?)_([38]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
它不起作用,但如果我这样做:

(.*?)_([PH]{2})(.*?) _(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)_(.*?)(\d{16})(.*)
它将把PH分为一组,而不是38?所以我在这一点上迷路了


任何帮助都会很好

我假设您正在尝试从数字开始匹配第2组。如果是这种情况,则必须更改源字符串,例如

0296005_383843C5_SEQ_6210_数量_计费_开发_0000000000000183.PS

它可以工作,请在

上查看它,使用[^\u]*在您的情况下比。*执行得更好?因为它不会倒退。因此,将原始正则表达式从:

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

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

最好的方法可能是实际拆分u上的字符串,然后测试第二个元素是否包含38。由于您尚未指定语言,我无法帮助您演示如何使用您的语言,但大多数语言都使用contains或indexOf方法来确定字符串中是否存在子字符串

但是,单独使用正则表达式可以通过使用以下正则表达式来实现

确保第二部分中存在38个:

([^_]*)_([^_]*38[^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
([^_]*)_([^_]*)(38)([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
在第二部分中捕获38个字符:

([^_]*)_([^_]*38[^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
([^_]*)_([^_]*)(38)([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_([^_]*)_(.*?)(\d{16})(.*)
尝试使用下面的正则表达式来匹配任何前3个字符/小数和1个小数 .?[A-Z0-9]{3}[0-9]{1}.?*

请尝试下面的正则表达式来匹配任何前3个字符/小数和1个小数/字符 .?[A-Z0-9]{3}[A-Z0-9]{1}.?*

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

如果你的前两个字母是一个常数,比如PH值,那么试试下面的公式 .?[PH]+[0-9A-Z]{2}.?*


因为38不在第二个组的开头,所以PH是。有没有办法从组的中间提取文本?如果在这一点上你有.*?[38]{2}.*?u它会起作用。另一点要补充的是,如果你只想匹配38,那么就使用.*?38.*?\u,目前你将匹配33、38、83、88。另外,侧注,使用[^.]*比。*?[^.*.[^.*.[^.*.[^.*.[^.*.[^.*.[^.[^.*.[^.[^.*.[^.[^.*.[^.*.[^.[^.*.[^.[^.*.[^.*.[^.[^.[^.*.*.[^.[^.[^.*.[^.[^.+.[.[^.[^.[^.+.[.[.]d{16}.*.*.]使用42个步骤,而不是原始正则。