gpt4 book ai didi

c++ - 相同的正则表达式,但在 Linux 和 Windows 上的结果不同,仅 C++

转载 作者:可可西里 更新时间:2023-11-01 10:03:35 25 4
gpt4 key购买 nike

我的命令行程序有这个模式:
^s?([/|@#])(?:(?!\1).)+\1(?:(?!\1).)*\1(?:(?:gi?|ig)?(?:\1\d\d?)?|i)?$
基于 C++ 的 ECMAScript 262

这是一种特殊模式,用于检查用户是否输入了正确的命令。这是针对这样的字符串的测试:
optional-s/one-or-more/anything/optional-g-or-i/optional-2-digits

Here is my previous question why I need this pattern .
虽然它在 Linux 上运行良好,但不适用于 Windows。我也知道两台机器上的换行符,我有读这个:How are \n and \r handled differently on Linux and Windows?

我的程序可以处理任何文件,它只获取命令行 argv[ 1 ]std::regex_match 测试的第一个参数 < strong>entered-user-synopsis是否正确。
比如:./program 's/one/two/' *.txt 简单地将所有 txt< 的 one 重命名为 two/strong> 文件

C++代码:

std::string argv_1 = argv[ 1 ]; // => s/one/two/
bool rename_is_correct =
std::regex_match( argv_1, std::basic_regex< char >
( "s?([/|@#])(?:(?!\\1).)+\\1(?:(?!\\1).)*\\1(?:(?:gi?|ig)?(?:\\1-?[1-9]\\d?)?|i)?" ) );

问题:
尽管该模式是非贪婪;在 Windows 上,它变得贪婪并匹配超过 4 个分隔符。因此它不应该匹配 /one/two/three/four/five/ 但这个字符串是匹配的!


注意:

  • 我故意放弃了 ^$ 断言,因为在 C++ 正则表达式中 std::regex_match 默认有它们,而且不需要使用它们
  • 还有两个反斜杠\\;其中之一是转义字符
  • javescript 代码说

const regex = /^s?([/|@#])(?:(?!\1).)+\1(?:(?!\1).)*\1((?:gi?|gi)\1-?[1-9]\d|i)?$/gm;
var str = 's/one/two/gi/-33/';
if( str.match( regex ) ){
console.log( "okay" );
} else {
console.log( "no" );
}

  • Perl 也说 no,如您在屏幕截图中所见,但 c++ 说 okay

enter image description here

有人知道它为什么会变得贪婪吗?

谢谢。

最佳答案

GCC 中似乎有一个错误已在 5.4 版中得到修复。我的猜测是您在 Windows 设置上运行的是旧版本。

查看输出的差异:

是否包含 boost 似乎没有什么区别。

该错误与 (?!\\1) 相关,用 (?![/]) 替换它(在这两种情况下)解决了问题,但显然这会限制正则表达式仅用于 / 定界符:

此外,错误出现在这个简单的正则表达式中:(.)((?!\\1).) 应该拒绝像 aa 这样的输入:

结论:确保安装 GCC 5.4 或更高版本。

关于c++ - 相同的正则表达式,但在 Linux 和 Windows 上的结果不同,仅 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42627957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com