![](/img/trans.png)
[英]Same C++ 'if' statement, different results on Linux/Windows
[英]the same regex but different results on Linux and Windows only C++
我的命令行程序具有以下模式:
^s?([/|@#])(?:(?!\\1).)+\\1(?:(?!\\1).)*\\1(?:(?:gi?|ig)?(?:\\1\\d\\d?)?|i)?$
基於ECMAScript 262
for C ++。
這是一種特殊模式,用於檢查用戶是否輸入了正確的命令。 這是對像這樣的字符串的測試:
optional-s/one-or-more/anything/optional-g-or-i/optional-2-digits
這是我以前的問題,為什么我需要這種模式 。
盡管它在Linux上運行良好,但在Windows上卻無法運行。 我也知道兩台機器上的換行符,並且我讀到以下內容: \\ n和\\ r在Linux和Windows上的處理方式有何不同?
我的程序可以處理任何文件,它僅獲取命令行argv[ 1 ]
的第一個參數,並且std::regex_match
測試輸入的用戶簡介是否正確。
像: ./program 's/one/two/' *.txt
,它可以將所有txt文件的名稱簡單地重命名為一到二
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
具有它們,因此不需要使用它們 \\\\
; 其中之一是逃脫角色 no
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" ); }
no
,因為你可以在截圖中看到,但C ++說okay
有人知道為什么它變得貪婪嗎?
謝謝。
GCC中似乎有一個錯誤已在5.4版中修復。 我的猜測是您正在Windows設置上運行舊版本。
在以下位置查看輸出差異:
是否包括boost
似乎沒有什么區別。
該錯誤與(?!\\\\1)
,因為用(?![/])
替換(在兩種情況下)都可以解決該問題,但是顯然,這將限制正則表達式僅與/
分隔符一起使用:
(?![1])
4.9版 :“否”(正確) 此外,該錯誤還會通過以下簡單的正則表達式出現: (.)((?!\\\\1).)
,該表達式應拒絕aa
類的輸入:
結論:確保安裝GCC 5.4或更高版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.