RegEx - 只匹配开头有美元符号的字符串
RegEx - Match Only Strings That Have a Dollar Sign At Their Beginning
几个小时以来,我一直在尝试完成此任务,但我仍处于学习 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 中看到的那样,它也匹配括号内的字符串,即使它们的开头没有美元符号,我需要防止这种情况发生。
我尝试像这样添加积极的回顾:
(?<=$\w+)
但这在这个引擎中不起作用,错误:
a quantifier inside a lookbehind makes it non-fixed width
有什么办法可以实现吗?
顺便说一句,我这样做是因为我的最终目标是使用替换将单引号添加到括号中的所有字符串,所以这样的行 $product_name=$list[CapTureMe];
将变成 $product_name=$list['CapTureMe'];
例如,使用这个:
['']
谢谢
在简单的情况下你可以使用
($\w+)\[(\w*[a-z]\w*)\]
作为你的正则表达式和
['']
作为替补。
正则表达式的详细信息:
$\w+
匹配一个 $
符号,后跟 1 个或多个单词字符(字母、数字、下划线)
(
)
捕获匹配的字符串 (#1)
\[
匹配文字 [
\w*[a-z]\w*
匹配 0 个或多个单词字符,后跟一个小写字母,然后是 0 个或多个单词字符(即我们匹配一个在某处至少包含一个小写字母的单词)
(
)
捕获匹配的字符串 (#2)
\]
匹配文字 ]
我们将其替换为
</code> - 第一个捕获缓冲区的内容</li>
<li><code>['
- 字面上的两个字符 [
和 '
</code> - 第二个捕获缓冲区的内容</li>
<li><code>']
- 字面上的两个字符 '
和 ]
如果需要,您可以变得更花哨(这很快就会失控):
((?:$|->)\w+)\[(\w*[a-z]\w*)\]
也允许在开头使用 ->
而不是 $
。这将匹配例如->bar[baz]
在 $foo->bar[baz]
.
另一个可能的补充是
((?:$|->)\w+(?:\[$\w+\])*)\[(\w*[a-z]\w*)\]
(?:\[$\w+\])*
部分允许在初始标识符和末尾未加引号的单词之间有 0 个或多个带括号的变量名。这将匹配例如$foo[$bar][$baz][quux]
(</code> 中有 <code>$foo[$bar][$baz]
,</code> 中有 <code>quux
。
但是,none 这些解决方案将匹配 $foo[bar][baz]
中的 bar
和 baz
。这是一项非常重要的任务,因为它需要重叠匹配。
几个小时以来,我一直在尝试完成此任务,但我仍处于学习 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 中看到的那样,它也匹配括号内的字符串,即使它们的开头没有美元符号,我需要防止这种情况发生。 我尝试像这样添加积极的回顾:
(?<=$\w+)
但这在这个引擎中不起作用,错误:
a quantifier inside a lookbehind makes it non-fixed width
有什么办法可以实现吗?
顺便说一句,我这样做是因为我的最终目标是使用替换将单引号添加到括号中的所有字符串,所以这样的行 $product_name=$list[CapTureMe];
将变成 $product_name=$list['CapTureMe'];
例如,使用这个:
['']
谢谢
在简单的情况下你可以使用
($\w+)\[(\w*[a-z]\w*)\]
作为你的正则表达式和
['']
作为替补。
正则表达式的详细信息:
$\w+
匹配一个$
符号,后跟 1 个或多个单词字符(字母、数字、下划线)(
)
捕获匹配的字符串 (#1)\[
匹配文字[
\w*[a-z]\w*
匹配 0 个或多个单词字符,后跟一个小写字母,然后是 0 个或多个单词字符(即我们匹配一个在某处至少包含一个小写字母的单词)(
)
捕获匹配的字符串 (#2)\]
匹配文字]
我们将其替换为
</code> - 第一个捕获缓冲区的内容</li> <li><code>['
- 字面上的两个字符[
和'
</code> - 第二个捕获缓冲区的内容</li> <li><code>']
- 字面上的两个字符'
和]
如果需要,您可以变得更花哨(这很快就会失控):
((?:$|->)\w+)\[(\w*[a-z]\w*)\]
也允许在开头使用 ->
而不是 $
。这将匹配例如->bar[baz]
在 $foo->bar[baz]
.
另一个可能的补充是
((?:$|->)\w+(?:\[$\w+\])*)\[(\w*[a-z]\w*)\]
(?:\[$\w+\])*
部分允许在初始标识符和末尾未加引号的单词之间有 0 个或多个带括号的变量名。这将匹配例如$foo[$bar][$baz][quux]
(</code> 中有 <code>$foo[$bar][$baz]
,</code> 中有 <code>quux
。
但是,none 这些解决方案将匹配 $foo[bar][baz]
中的 bar
和 baz
。这是一项非常重要的任务,因为它需要重叠匹配。