簡體   English   中英

使用UTF-8在非ASCII字符上運行Ascii正則表達式

[英]Running Ascii regex over non-ASCII characters with UTF-8

#include <boost/regex.hpp>

#include <string>
#include <vector>
#include <iostream>

int main(int argc, char* argv[]) {

    std::string text = argv[1];
    std::string patterns = argv[2];

    boost::regex regex = boost::regex(patterns);

    boost::smatch match;

    std::cout << boost::regex_search(text, match, regex) << std::endl;    
}

如果我通過輸入hello¿ ¿ (包含UTF-8編碼的非ASCII字符)運行程序,它返回0即未找到,但是如果我通過輸入hel√√運行它(再次包含非ascii)它返回1,即找到。

我的問題:當運行utf字符時, boost::regex (即ascii版本)的預期行為是什么?


編輯:感謝所有的評論,我仍然感興趣的是為什么輸出正好1,因為文本和正則表達式都包含非ascii字符。 我的猜測是字節被解釋為ascii,因此它們匹配。

  1. 在ASCII字符串上使用正則表達式,就是使用“bytes”來查找模式。
    在UTF-8字符串上使用正則表達式是關於在“多字節”序列上使用正則表達式,其中序列表示Unicode代碼點。

    因此,正則表達式應用於Unicode字符串,其編碼具有每個字符可變的字節數。

    UTF-8字符串包含1到4個字節的多字節序列,表示Unicode“字符”。 在UTF-8中,只有ASCII 7位字符是1字節“寬”。

    因此 - 在UTF-8編碼的字符串上使用ASCII正則表達式引擎 ,忽略UTF-8編碼字符串中的多字節序列,並導致逐字節匹配模式。 在UTF-8編碼的字符串上使用此ASCII正則表達式引擎的結果無效

    請查看http://utfcpp.sourceforge.net

    要使正則表達式處理UTF-8編碼的字符串,您必須...

    • 有UTF-8字符串迭代器可用於正則表達式,或
    • 使用std::codecvt_utf8結合臨時設置全局語言環境以使正則表達式工作,或者
    • 必須將UTF-8編碼的字符串轉換為UTF-16編碼的字符串,以便與Unicode正則表達式引擎一起使用 - 基於std :: wstring。
  2. regex_search函數在匹配時返回布爾值和true
    在您的情況下,ASCII正則表達式模式匹配UTF-8編碼字符串的一部分,該字符串被無效地解析為ASCII字符串 - 正如您所假設的那樣!
    如果您使用UTF-8編碼的字符串中的英文文本,則可以安全地使用ASCII正則表達式引擎。 保留ASCII 7位范圍,使得ASCII正則表達式引擎的結果不可靠。

這是一個錯誤,而不是一個功能:我在一個更好的系統上嘗試了你的例子(在Windows MinGW上的g ++ 4.9.2),一切都很順利:

#include <iostream>
#include <string>
#include <regex>
int main()
{ std::string text ="hello¿"; // or "hello√"
  std::string patterns ="¿";  // or "√"
  std::regex regex = std::regex(patterns);
  std::smatch match;
  std::cout << std::regex_search(text, match, regex) << std::endl;
}

輸出:

1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM