标签: pcre

在utf-8中的php正则表达式字边界匹配

我在utf-8 php文件中有以下php代码:

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));
Run Code Online (Sandbox Code Playgroud)

我希望最后一个正则表达式只能替换完整的单词,而不是单词的一部分.

在我的Windows计算机上,它返回:

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)
Run Code Online (Sandbox Code Playgroud)

在网络服务器(linux)上,我得到:

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"
Run Code Online (Sandbox Code Playgroud)

因此,正则表达式的工作方式与我在Windows上的预期相同,但不适用于Linux.

所以主要问题是,我应该如何编写我的正则表达式才能匹配单词边界?

第二个问题是我如何让Windows知道我想在我的php应用程序中使用utf-8.

php regex pcre utf-8 word-boundary

12
推荐指数
2
解决办法
6976
查看次数

Nginx在Mac OS X Lion上安装.找不到PCRE

首先,我正在尝试编译所有源代码,我不使用MacPorts或HomeBrew.

我已经安装了pcre /usr/local/pcre-8.21并将其符号链接到/usr/local/pcre.

我在这里设置/usr/local/pcre/bin了我的PATH变量.

`/usr/local:/usr/local/mysql/bin:/usr/local/pcre/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin`
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试安装Nginx,但我不断收到此消息:

./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option.

我尝试过设置,--with-pcre=/usr/local/pcre/bin但它只是尝试重新安装PCRE.

任何人都可以帮我解决这个问题吗?谢谢.

pcre nginx osx-lion

12
推荐指数
1
解决办法
8481
查看次数

在HTML5模式输入元素属性上使用什么是安全的PCRE正则表达式分隔符?

似乎HTML5规范(以及因此ECMA262)允许<input type="text" pattern="[0-9]/[0-9]" />匹配字符串'0/0',即使正斜杠没有被转义.像Drupal这样的Web应用程序希望为不支持HTML5的浏览器提供服务器端验证,例如:

<?php
preg_match('/^(' . $pattern . ')$/', $value);
?>
Run Code Online (Sandbox Code Playgroud)

不幸的是,字符串'[0-9]/[0-9]'不是有效的PRCE正则表达式.似乎大多数(如果不是全部)支持HTML5的浏览器都支持这两者pattern="[0-9]/[0-9]" 并且 pattern="[0-9]\/[0-9]"引发了一个问题 - 我们可以使用什么作为分隔符来运行这种模式来对抗Perl风格的正则表达式?

我们已针对W3C规范提交了错误报告,但这里的浏览器是错误的吗?是否需要澄清HTML5规范?我们可以在PHP中使用解决方法吗?

php regex html5 pcre

12
推荐指数
2
解决办法
1299
查看次数

正则表达式匹配单词,或什么都不匹配

我真的很难在这上面贴上标签,这可能就是为什么我无法通过搜索找到我需要的东西.

我想要匹配以下内容:

  • 自动回复
  • 自动回复
  • 自动回复

我正在使用的平台不允许指定不区分大小写的搜索.我尝试了以下正则表达式:

.*[aA]uto(?:matic)[ ]*[rR]eply.*
Run Code Online (Sandbox Code Playgroud)

认为(?:matic)会导致我的表达匹配AutoAutomatic.但是,它只是匹配Automatic.

  • 我究竟做错了什么?
  • 这里的术语是什么?

这是使用Perl作为正则表达式引擎(我认为这是PCRE但我不确定).

regex perl pcre

12
推荐指数
2
解决办法
3万
查看次数

自动检测相同的连续std :: string :: find()调用

在代码审查期间,我找到了这样的源代码:

void f_odd(std::string &className, std::string &testName)
{
   if (className.find("::") != std::string::npos)
   {
     testName = className.substr(className.find("::") + 2);
     (void)className.erase(className.find("::"), std::string::npos);
   }
}
Run Code Online (Sandbox Code Playgroud)

在这个函数中,std :: string :: find()被调用三次,具有相同的模式(这里是"::").

这个代码当然可以重构为

void f(std::string &className, std::string &testName)
{
   const size_t endOfClassNamePos = className.find("::");
   if (endOfClassNamePos != std::string::npos)
   {
     testName = className.substr(endOfClassNamePos + 2);
     (void)className.erase(endOfClassNamePos, std::string::npos);
   }
}
Run Code Online (Sandbox Code Playgroud)

find只被调用一次.

有人知道检测这种模式的策略吗?我有一个巨大的代码库,我打算发现这种模式.我计划使用Windows或Linux环境.

潜在的策略

  1. 使用/调整静态代码分析工具,如cppcheck来检测这些奇怪的东西.
  2. 使用正则表达式在代码库中搜索.
  3. 使用/ adapt clang-tidy来检测这种模式.
  4. 用某种语言编写自定义检查器(例如Python)来检测这些问题.在这种情况下,应该对预处理的代码执行检查.

没有Go

  • 手动审查

更新1

我决定从潜在的策略开始1).我打算让cppcheck适应这个问题.

Cppcheck提供了基于PCRE正则表达式编写自定义规则的可能性.为此,必须使用启用的PCRE支持编译cppcheck.由于当前测试环境是基于Linux的,因此可以使用以下命令下载最新版本的cppcheck:

git clone https://github.com/danmar/cppcheck.git && cd cppcheck

之后,编译并安装该工具,如下所示:

sudo make install HAVE_RULES=yes

现在基本工具设置完成了.为了开发一个cppcheck规则,我准备了一个简单的测试用例(file:test.cpp),类似于本文第一部分中的示例代码.此文件包含三个功能和cppcheck规则应在发出警告f_odd …

c++ regex pcre static-code-analysis cppcheck

12
推荐指数
1
解决办法
276
查看次数

是否可以编写Perl/Java/etc正则表达式来匹配十进制(非)素数?

相关问题/材料:

众所周知,由各种编程语言支持的"正则表达式"生成在形式意义上非常规的语言,并且如上述材料所示,能够识别至少一些上下文敏感语言.

语言L = {x | x是基数10中的素数.}是一种上下文敏感语言,因为素数可以通过线性有界自动机来测试(但它不是通过泵浦引理参数的无上下文语言).

那么,是否可以编写一个Perl或Java正则表达式,它恰好接受基数为10的所有素数?如果感觉更容易,可以随意替换≥2的任何其他基础或精确识别所有复合数字.

例如,使用转义来运行任意Perl代码被视为作弊.重复替换(很容易图灵完成)也超出了范围; 整个工作应该在正则表达式内完成.这个问题更多的是关于正则表达式实际有多强大的界限.

java regex pcre context-sensitive-grammar

12
推荐指数
1
解决办法
546
查看次数

使用正则表达式删除冗余换行符

我正在用PHP 开发一个服务站点,它只显示访问者发布的消息(理想情况是围绕网站的主题).任何人都可以每小时发布三条消息.

由于网站只有一页,我想控制每条消息的垂直长度.但是,我确实希望至少部分保留原始邮件中的换行符.折衷方案是允许两个换行符,但如果有两个换行符,则将它们替换为一行中总共两个换行符.Stack Overflow实现了这一点.

例如:

"豪猪\n是否\n \n \n \nporcupiney."

会变成

"豪猪是<br /> <br />豪猪."

检查换行符的一个棘手方面是它们被收集并存储为\ r \n,\ r或\n的可能性.我想过使用nl2br()将所有换行符转换为<br />,但这似乎没必要.

我的问题:在PHP中使用正则表达式(使用preg_match()和preg_replace()等函数),如何检查一行中两个以上换行符的实例(它们之间是否有空格),然后将它们更改为共有两个换行符?

php regex pcre line-breaks duplicates

11
推荐指数
2
解决办法
2万
查看次数

我怎样才能从preg_match获得命名的捕获?

可能重复:
如何强制preg_match preg_match_all仅返回正则表达式的命名部分

我有这个片段:

$string = 'Hello, my name is Linda. I like Pepsi.';
$regex = '/name is (?<name>[^.]+)\..*?like (?<likes>[^.]+)/';

preg_match($regex, $string, $matches);

print_r($matches);
Run Code Online (Sandbox Code Playgroud)

这打印:

Array
(
    [0] => name is Linda. I like Pepsi
    [name] => Linda
    [1] => Linda
    [likes] => Pepsi
    [2] => Pepsi
)
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它返回:

Array
(
    [name] => Linda
    [likes] => Pepsi
)
Run Code Online (Sandbox Code Playgroud)

无需过滤结果数组:

foreach ($matches as $key => $value) {
    if (is_int($key)) 
        unset($matches[$key]);
}
Run Code Online (Sandbox Code Playgroud)

php regex pcre preg-match

11
推荐指数
1
解决办法
1万
查看次数

使用正则表达式匹配递增整数的列表

是否可以匹配逗号分隔的十进制整数列表,其中列表中的整数总是递增1?

这些应匹配:

0,1,2,3
8,9,10,11
1999,2000,2001
99,100,101
Run Code Online (Sandbox Code Playgroud)

这些不匹配(完整 - 最后两个具有匹配的子序列):

42
3,2,1
1,2,4
10,11,13
Run Code Online (Sandbox Code Playgroud)

regex pcre

11
推荐指数
1
解决办法
439
查看次数

原子团清晰度

考虑这个正则表达式.

a*b
Run Code Online (Sandbox Code Playgroud)

这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac

这会使67调试器中的步骤失败.

现在考虑这个正则表达式.

(?>a*)b
Run Code Online (Sandbox Code Playgroud)

这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac

这会使133调试器中的步骤失败.

最后这个正则表达式:

a*+b  (a variant of atomic group)
Run Code Online (Sandbox Code Playgroud)

这将失败的情况下 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac

这会使67调试器中的步骤失败.

当我检查基准测试atomic group (?>a*)b执行179%得更快.

现在原子组禁用回溯.所以比赛中的表现很好.

  1. 但为什么步数更多呢?有人可以解释一下吗?

  2. 为什么会有差异.在两个原子团(?>a*)b和之间的步骤a*+b.

他们的工作方式不同吗

regex pcre backtracking

10
推荐指数
2
解决办法
699
查看次数