过去我的正则表达和西里尔字母有问题,所以我想知道是否有什么我做错了吗?
以下是两个可重复的例子:
示例1 - 前瞻和后瞻断言的问题:
latin <- "city New York, Manhattan\n1st Avenue"
cyrilic <- "град Ню Йорк, Манхатън\n1во Авеню"
stringr::str_extract(latin, pattern = "(?<=city New York, )[\\w\\s]+(?=\n)")
#returns: Manhattan
stringr::str_extract(cyrilic, pattern = "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
stringr::str_extract(cyrilic, pattern = "(?<=град Ню Йорк, ).+(?=\n)")
#both return: NA
示例2 - grep的ignore.case = TRUE问题:
randomWord <- "Човек"
grep(pattern = "човек", x = randomWord, ignore.case = T)
#returns: integer(0)
关于如何编写正则表达式以使它们在西里尔字母中工作的任何想法?
我的默认文本编码是UTF-8,这是我的sessionInfo:
> sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
locale:
[1] LC_COLLATE=Bulgarian_Bulgaria.1251 LC_CTYPE=Bulgarian_Bulgaria.1251
[3] LC_MONETARY=Bulgarian_Bulgaria.1251 LC_NUMERIC=C
[5] LC_TIME=Bulgarian_Bulgaria.1251
答案 0 :(得分:1)
我不确定为什么<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<h1>Responsive Popup</h1>
<a class="popup-trigger" data-target="#popup1">Open PopUp 1</a>
<a class="popup-trigger" data-target="#popup2">Open PopUp 2</a>
</div>
<div id="popup1" class="popup">
<div class="popup-text">This is my popup 1</div>
<span class="popup-btn-close">×</span>
</div>
<div id="popup2" class="popup">
<div class="popup-text">This is my popup 2</div>
<span class="popup-btn-close">×</span>
</div>
在这种情况下会返回str_extract
,因为正则表达式似乎有效。
但NA
和str_locate
似乎按预期工作:
str_detect
针对您的问题的解决方法是将stringr::str_detect(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
#returns TRUE
stringr::str_locate(cyrilic, "(?<=град Ню Йорк, )[\\w\\s]+(?=\n)")
#returns the start and end positions for Манхатън
与substr()
结合使用:
str_locate
答案 1 :(得分:1)
问题可能在于ICU如何处理从字符串str_extract
收到的模式:似乎所产生的lookbehind模式停止具有已知宽度。或者,str_extract
还存在其他一些错误。
在这种情况下,使用没有模式长度问题的str_match
会更安全:
> str_match(cyrilic, pattern = "град Ню Йорк,\\s*([\\w\\s]+)\n")[,2]
[1] "Манхатън"
只需访问正确的组,此处,它是结果列表中的第二项。
对于与grep
一起使用的TRE正则表达式,我还观察了不同环境中的各种问题。在我的Windows 7计算机上,您的代码返回1
。但是,使用文字Unicode字母的TRE正则表达式可能会失败,最佳做法是使用PCRE正则表达式。要使其完全支持Unicode,请不要忘记在模式开始时添加(*UCP)
PCRE谓词,以便\w
,\d
等可以匹配所有Unicode字符。这里没有必要和
> randomWord <- "Човек"
> grep(pattern = "човек", x = randomWord, ignore.case = T, perl=TRUE)
[1] 1
同样有效。