提问人:Dasy 提问时间:10/12/2021 最后编辑:JesperDasy 更新时间:10/12/2021 访问量:94
我正在使用正则表达式函数,但它不起作用?
i am using regex function but it didn't work?
问:
当我使用正则表达式函数作为标题和标题时,它可以工作 但是当我添加更多匹配标签时,它就不起作用了
这是下面的代码,可以正常工作,没有任何问题
$(".sidebar").each(function() {
var e = $(this),
t = e.find(".widget").text();
if (t) {
var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/);
alert(t);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2)</div>
</div>
但问题是当我尝试使用多个匹配标签时,它不起作用 喜欢
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
我努力使用与上面相同的正则表达式来表示这个值,但它不起作用
我还想添加这些示例文本,输出看起来像是 example1、example2、example3、example4、example5,但我不知道使用正则表达式函数完成
任何帮助或建议将不胜感激
答:
不要使用 ,请考虑使用 ,这样也可以访问捕获组。理想情况下,捕获组应捕获字符后面的括号内的值,因此您可以将正则表达式模式编写为:match()
exec()
=
var re = /\w+?=\((.*?)\)/gi;
然后,只需运行一个循环以递归方式调用该方法,直到找不到更多匹配项:while
exec()
$(".sidebar").each(function() {
var e = $(this);
var t = e.find(".widget").text();
if (t) {
var result;
var results = [];
var re = /\w+?=\((.*?)\)/gi;
while ((result = re.exec(t)) !== null) {
console.log(result[1]);
results.push(result[1]);
}
console.log('Logging all captured values:\n', results);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>
更好的是:你甚至不需要jQuery:
document.querySelectorAll('.sidebar .widget').forEach(el => {
const t = el.innerText.trim();
if (t) {
let result;
const results = [];
const re = /\w+?=\((.*?)\)/gi;
while ((result = re.exec(t)) !== null) {
console.log(result[1]);
results.push(result[1]);
}
console.log('Logging all captured values:\n', results);
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>
下面是一个示例,说明如何在给定此格式的情况下获取任何值:
匹配任何不是
)
的任何内容一次或多次。
必须前面
,并且必须后面\w+=(
)
在此 Regex101 示例中更好地解释
$(".sidebar").find(".widget").each(function() {
const txt = $.trim($(this).text()); // Get trimmed text
if (!txt) return; // Do nothing
const matches = txt.match(/(?<=\b\w+=\()[^)]+(?=\))/g)||[];
matches.forEach(m => {
console.log(m);
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
<div class="widget">ola</div>
<div class="widget"></div>
<div class="widget">The magic happens=(here) :)</div>
</div>
在代码中,使用 which is the result fromalert(t);
t = e.find(".widget").text();
如果使用结果,则正则表达式将返回 的匹配项,其中 和 在捕获组中具有值,但匹配项应按该顺序进行。var a = t.match(/title=\(([^)]*)\)\s+caption=\(([^)]*)\)/);
title=
caption=
您将得到一个匹配项,因为没有标志,并且在示例数据中也只有 1 次出现。/g
你可以做的是让你的表达式不那么严格一些,而不是专门匹配标题和捕获,而是匹配 1 个或多个非空格字符,而不是等号。
使用标志获取所有匹配项,而不是单个匹配项。/g
[^\s=]+=\(([^)]*)\)
[^\s=]+
匹配 1+ 乘以除空格字符或空格字符以外的任何字符=
=
从字面上匹配\(
火柴(
([^)]*)
在第 1 组中捕获除 or use 以外的可选字符,而不是 for 1 或多个)
+
*
\)
火柴)
用于查看捕获的组值的正则表达式演示:
$(".sidebar").each(function() {
var e = $(this),
t = e.find(".widget").text();
if (t) {
var a = t.matchAll(/[^\s=]+=\(([^)]*)\)/g);
console.log(Array.from(a, m => m[1]));
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='sidebar'>
<div class='widget'>title=(example1) caption=(example2) button=(example3) price=(example4) off=(example5)</div>
</div>
评论
/.../g
button
price