regex - RegEx - 仅匹配开头有美元符号的字符串
问题描述
我已经尝试完成这几个小时,但我仍处于学习 RegEx 的开始阶段,因此向这里的专家寻求帮助。如何仅匹配开头有美元符号的字符串?我已经用这个正则表达式取得了部分成功:
(?<=\$)\[(?=[^\]]*[a-z])([a-zA-Z_]+[\w]+)\]
在这个代码块上:
<?php
$options[$list[_capture_me]][]=array($list[_captureme],$list[_capture_me]);
$option_names[$list[_capture_me]]=$list[_captureme];
$product_name=$list[capture_me];
$product_name=$list[0];
$product_name=$list[DONTCAPTUREME];
$product_name=$list[CapTureMe];
$product_name=$list[CapTurEME];
$actionKey = $get[DONT_CAPTURE_ME];
if(array_key_exists(DONT_CAPTURE_ME,$get)) {
$actionKey = $get[DONT_CAPTURE_ME];
if(array_key_exists($actionKey,$this->arrPageActions)){
$this->arrAllTemplatesAndAttributes[$templateID][captureme]['Capture_Me'][$res[option_values_id]] = $res[DONT_CAPTURE_ME];
$old_faq_id.="$result[faq_id]&";
$result['toc']="<b><a href=$PHP_SELF#$result[faq_id]>$result['question']</a></b>";}
$result['toc']="<b><a href=$PHP_SELF#$result[faq_id]>$result[QUESTION]</a></b>";}
$login_groups_id = $check_admin[login_groups_id];
?>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
function check_input(field_name, field_size, message) {
if ($elements[capture_me] && (form.elements[dont_capture].type != "hidden") && $form.elements[capture_me]) {
var field_value = form.elements[dontcapture].value;
var field_value = $form.elements[captureme].value;
if (field_value == '' || field_value.length < field_size) {
error_message = error_message + "* " + message + "\n";
error = true;
}
}
}
正如您在DEMO中看到的那样,它还匹配括号内的字符串,即使它们的开头没有美元符号,我需要防止这种情况发生。我尝试像这样添加积极的lookbehind:
(?<=\$\w+)
但这在这个引擎中不起作用,错误:
后视内的量词使其宽度不固定
有什么办法可以做到这一点?
顺便说一句,我这样做是因为我的最终目标是使用替换为括号中的所有字符串添加单引号,因此像这样的$product_name=$list[CapTureMe];
行将变成$product_name=$list['CapTureMe'];
例如,使用这个:
['\1']
谢谢
解决方案
在简单的情况下,您可以使用
(\$\w+)\[(\w*[a-z]\w*)\]
作为你的正则表达式和
$1['$2']
作为替代品。
详细的正则表达式:
\$\w+
匹配一个$
符号,后跟 1 个或多个单词字符(字母、数字、下划线)(
)
捕获匹配的字符串(#1)\[
匹配文字[
\w*[a-z]\w*
匹配 0 个或多个单词字符,后跟一个小写字母,后跟 0 个或多个单词字符(即,我们匹配的单词在某处至少包含一个小写字母)(
)
捕获匹配的字符串(#2)\]
匹配文字]
我们将其替换为
$1
- 第一个捕获缓冲区的内容['
- 从字面上看,这两个字符[
和'
$2
- 第二个捕获缓冲区的内容']
- 从字面上看,这两个字符'
和]
如果需要,您可以变得更花哨(这可能会很快失控):
((?:\$|->)\w+)\[(\w*[a-z]\w*)\]
也允许->
在开头而不是$
. 这将匹配例如->bar[baz]
in $foo->bar[baz]
。
另一个可能的补充可能是
((?:\$|->)\w+(?:\[\$\w+\])*)\[(\w*[a-z]\w*)\]
该(?:\[\$\w+\])*
部分允许在初始标识符和末尾未引用的单词之间包含 0 个或多个括号变量名称。这将匹配例如$foo[$bar][$baz][quux]
(与$foo[$bar][$baz]
in$1
和quux
in $2
)。
但是,这些解决方案都不能同时匹配bar
和baz
in $foo[bar][baz]
。这是一项非常重要的任务,因为它需要重叠匹配。
推荐阅读
- javascript - 在 JSON.parse 之后检索类原型
- sql - SQL 在数据子集上连接两个表
- c# - Windows 7 上的相机录制失败
- android - ImageView 调整大小并保持纵横比
- javascript - 如何在点击时绘制点并将它们与线条 HTML 连接起来
- ios - 我如何从 UIView 转到 UIViewController 故事板
- java - 如何在黄瓜硒中迭代特征文件
- business-intelligence - 时间维度:加载日期
- python - 如何让终端中的 vscode 调试不那么冗长?
- jquery - DataTables - Ajax 分页损坏