php - 正则表达式重复组忽略字符串
问题描述
我做了一些研究,但对我的情况没有任何帮助。
我有这个正则表达式,我可以在其中获得 Stream # 0:4,但我想重复该规则并捕获 Stream # 0:5。我如何重复规则并在中间忽略-> # 0: 0 (copy) -> # 0: 1 (copy)
正则表达式
/(?<=Stream mapping:)(\s+)([a-zA-Z])+(\s+)#([0-9]:[0-9])/s
文本
Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help
我目前的结果
array(1) {
[0]=> array(5)
{
[0]=> string(15) " Stream #0:4"
[1]=> string(4) " "
[2]=> string(1) "m"
[3]=> string(1) " "
[4]=> string(3) "0:4" }
}
另一个问题是我的正则表达式将“m”视为单独的组合并包含空格。我该如何解决?
我想要一个最终的结果,比如
[0]Stream #0:4
[1]Stream #0:5
解决方案
您可以使用基于\G
运算符的自定义单词边界:
$re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
$str = 'Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help';
if (preg_match_all($re, $str, $m)) {
print_r($m[1]);
}
请参阅PHP 演示。
图案细节:
(?:\G(?!^)\s*|Stream mapping:\s*)
- 前一个匹配的结尾和 0+ 个空格字符或Stream mapping:
子字符串后跟 0+ 个空格\K
- 匹配重置运算符丢弃当前匹配的文本([a-zA-Z]+\s+#[0-9]+:[0-9]+)
- 第 1 组:1+ 字母、1+ 空格、#
、1+ 数字、:
、1+ 数字.*
- 任何 0+ 字符到行尾(必须使用它,因为我们需要连续匹配)
请参阅正则表达式演示。
推荐阅读
- python - API 值在范围内吗?
- kubernetes - 使用 Wordpress PVC 的 Kubernetes 获取旧的 Wordpress 文件
- asp.net - Razor 页面中无法识别传递的 IEnumerable(of T) 成员的模型类型
- node.js - Node.js如何将数组索引传递给异步函数
- r - 如何创建一个根据指定字典重命名列名的函数?
- android - 代号一个应用订阅 submitReceipt 未调用
- mysql - Laravel 迁移不兼容的外键
- tomcat - 使用 tomcat-for-java 插件在 vscode 中运行 war 包时发生与 `user.dir` 系统属性异常相关的权限被拒绝
- c# - Office365 SMTP 服务器替换主题中的国际字符
- c# - 如何基于单选按钮设置值