Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用磅符号替换包装数字的正则表达式_Php_Regex - Fatal编程技术网

Php 用磅符号替换包装数字的正则表达式

Php 用磅符号替换包装数字的正则表达式,php,regex,Php,Regex,在我的文本中,数字用大括号括起来,即{123}或{456ABC}。我还有一些没有用括号括起来的数字,即789。我想匹配这些尚未包装的数字,并使用PHP的preg_replace将它们包装为磅符号,即#789#。数字通常在1-3位之间 print(preg_replace('/\d+/','#$0#', '1) I can count to 2997510. You can only count to {456ABC}.')); 期望输出: #1#) I can count to #299751

在我的文本中,数字用大括号括起来,即
{123}
{456ABC}
。我还有一些没有用括号括起来的数字,即
789
。我想匹配这些尚未包装的数字,并使用PHP的preg_replace将它们包装为磅符号,即
#789#
。数字通常在1-3位之间

print(preg_replace('/\d+/','#$0#',
'1) I can count to 2997510. You can only count to {456ABC}.'));
期望输出:

#1#) I can count to #2997510#. You can only count to {456ABC}.
什么正则表达式可以匹配这些数字?我已经尝试过负前瞻
(?![^\{])\d+
[^\{](\d+[^\{]

[^\{\dA-F]([A-F\d]+)[^\}\dA-F]

(我假设您正在尝试将十六进制数字与大写字母匹配;如果不匹配,只需适当更改字符类即可。)

额外的
\d
在负数字符类中,因为如果它们不在那里,引擎将通过切断最外层的数字来避免括号。例如,
[^\{](\d+[^\}]
将匹配{34567}中的456

数字本身是任何匹配的“第1组”。如果需要整个匹配本身作为数字,请使用前向和后向:

(?
(\A[^{\d])(\d[\d\w]*)(\z[^\}\d\z])
应该为您做这件事

用法如下:

print(preg_replace('/(\A|[^{\d])(\d[\d\w]*)(\z|[^\}\d\z])/','$1#$2#$3',
'1) I can count to 2997510. You can only count to {456ABC}.'));
说明:

  • 第一部分
    (\A |[^{\d])
    匹配输入的开头(在字符串开头捕捉数字)或非
    {
    或数字。此部分确保数字尚未包装

  • 第二部分
    (\d[\d\w]*)
    对数字进行实际匹配。它匹配以数字开头,后跟任意数量连续数字或字母的任何内容

  • 最后一部分
    (\z |[^\}\d\z])
    与第一部分类似,只是查找输入的结尾

  • 由于此正则表达式可以捕获目标编号前后的字符,因此使用第1个和第3个匹配的子组(如PHP示例所示)将这些字符添加回十分重要


[^\{](\d+)[^\{]
和一些消极的前瞻组合
(?![^\{])\d+
像这样one@skibulk:通常情况下,您希望将您在此处的注释中添加的附加信息添加到您的问题中;这使人们更容易理解您的问题。@RobertP这很有道理!我现在就添加它。不考虑字母字符,即
456ABC
。这是m前导空格和尾随句点的匹配:#2997510.#整个过程应该与数字左右两侧的字符立即匹配,是的,但括号将数字分组,因此如果您要查找的是匹配项,则可以通过这种方式获得。编辑它以包含一些原始正则表达式的应用程序,这些应用程序可能更适合您的用例。我选择您的答案是因为\a和\Z实现ion非常出色。也是为了解释regex元素。我在脑子里想,我只需要将数字替换为$0,但是捕获并加入两侧匹配的字符是一种开箱即用的思维。我从中学到了很多;谢谢!