RegEx-仅匹配开头带有美元符号的字符串

时间:2018-08-06 22:02:30

标签: regex search replace pcre

我已经尝试了数小时来完成此任务,但是我仍在学习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+)

但这在此引擎中不起作用,错误:

  

向后隐藏的量词使宽度不固定

有什么办法可以做到这一点?

顺便说一句,我这样做是因为我的最终目标是使用替换将单引号添加到括号中的所有字符串,因此像这样的行$product_name=$list[CapTureMe];将变成$product_name=$list['CapTureMe']; ,使用此:

['\1']

DEMO #2

谢谢

1 个答案:

答案 0 :(得分: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]中的$foo->bar[baz]

另一种可能的添加方式是

((?:\$|->)\w+(?:\[\$\w+\])*)\[(\w*[a-z]\w*)\]

(?:\[\$\w+\])*部分允许在初始标识符和末尾未加引号的单词之间使用0个或多个括号括起来的变量名。这将匹配例如$foo[$bar][$baz][quux]$foo[$bar][$baz]中的$1quux中的$2)。

但是,这些解决方案都无法与bar中的baz$foo[bar][baz]都匹配。这是一项艰巨的任务,因为它将需要重叠的匹配。