我在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.
我试图将一些全字表达式与MySQL REGEXP函数匹配.当涉及双引号时有一个问题.
MySQL文档说:"要在正则表达式中使用特殊字符的文字实例,请在其前面加上两个反斜杠()字符."
但这些查询都返回0:
SELECT '"word"' REGEXP '[[:<:]]"word"[[:>:]]'; -> 0
SELECT '"word"' REGEXP '[[:<:]]\"word\"[[:>:]]'; -> 0
SELECT '"word"' REGEXP '[[:<:]]\\"word\\"[[:>:]]'; -> 0
SELECT '"word"' REGEXP '[[:<:]] word [[:>:]]'; -> 0
SELECT '"word"' REGEXP '[[:<:]][[.".]]word[[.".]][[:>:]]'; -> 0
Run Code Online (Sandbox Code Playgroud)
还有什么可以尝试获得1?或者这不可能吗?
正则表达式引擎具有"零宽度"匹配的概念,其中一些对于查找单词边缘很有用:
\b - 存在于大多数引擎中以匹配单词和非单词字符之间的任何边界\<\>- 并且- 在Vim中仅分别匹配单词开头的边界和单词的结尾处的边界.一些正则表达式引擎中的新概念是Unicode类.一个这样的类是脚本,可以区分拉丁语,希腊语,西里尔语等.这些例子都是等价的,匹配希腊语书写系统的任何字符:
\p{greek}\p{script=greek}\p{script:greek}[:script=greek:][:script:greek:]但到目前为止,在我阅读正则表达式和Unicode的来源时,我还无法确定是否有任何标准或非标准方法来实现零宽度匹配,其中一个脚本结束而另一个脚本开始.
在串????会有的之间的匹配?和?人物,就如同\b和\<会只是之前匹配?字符.
现在,对于这个例子,我可以根据寻找\p{Greek}后面的\p{Han}东西一起破解,我甚至可以根据两个Unicode脚本名称的所有可能组合来一起破解.
但这不是一个确定性的解决方案,因为每个版本仍然会在Unicode中添加新脚本.是否有一种面向未来的方式来表达这一点?或者是否有建议添加它?
regex unicode word-boundary word-boundaries character-properties
我想实现以下(全文搜索),
SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Run Code Online (Sandbox Code Playgroud)
我只对全文列中的精确字符串(而不仅仅是单词)感兴趣.
我一直在使用MySQL中的确切SQL,现在将大部分代码迁移到Android应用程序.
但我一直在看各种帖子,其中提到Android Sqlite不支持REGEXP(例如:link1,link2,link3).
有没有办法在Android中启用REGEXP?
如果没有上述SQL的替代品?
谢谢,
编辑: 目前我在Android中使用REGEXP时收到以下异常,
android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):...
Run Code Online (Sandbox Code Playgroud)
我知道我们可以使用GLOB和LIKE(或者甚至可以使用MATCH).如何columnname REGEXP '[[:<:]]somestring[[:>:]]'转换为使用GLOB和/或LIKE和/或MATCH?
解决方案1:随着@cybersam的帮助,我正在使用(经过一些修改)
SELECT * FROM tablename where
(columnname GLOB '*some string*' OR columnname GLOB '*Some string*') AND
(
(
(columnname GLOB '*[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]*' AND
columnname GLOB '*some string[^a-zA-Z0-9_]*' AND
columnname GLOB '*[^a-zA-Z0-9_]some string*')
OR
(columnname …Run Code Online (Sandbox Code Playgroud) 我用这段代码得到了意想不到的结果:
'foo'.match(new RegExp('\bfoo\b')); // Returns null
Run Code Online (Sandbox Code Playgroud)
null当这个返回"foo"时,为什么会返回?
'foo'.match(new RegExp('foo')); // Returns "foo"
Run Code Online (Sandbox Code Playgroud)
单词边界标记是否也与开头和结尾相匹配?
编辑:我需要正则表达式本身是一个字符串因为我注入变量.
我知道在正则表达式中涉及美元符号"$"的问题(这里:在PHP和JavaScript中)已被多次讨论过:是的,我知道我需要在它前面添加一个反斜杠"\"(取决于字符串处理甚至两个),但匹配美元符号的正确方法是"\ $"....去过那里,做到了,工作正常.
但这是我的新问题:美元符号"\ $"旁边标有"\ b"的字边界....我可以在regexpal.com上轻松复制以下示例.
让我们从以下文本开始搜索:
50美元
50美元
50美元
50美元
我的正则表达式应该找到"USD","Dollar"或"$".很容易:让我们试试吧
(USD |美元|\$)
成功:它找到"$","USD"和"Dollar"两种情况,包括"美元".
但是,让我们尝试通过在多项选择之后添加单词边界来跳过"美元":
(USD |美元|\$)\ b
这就是麻烦:"USD"匹配,"Dollar"匹配,"Dollars"被拒绝......但单曲,正确反击(或逃脱)"$"也被拒绝,尽管这只是一秒钟之前.
它与括号内的多项选择无关:试试吧
\ $
与
\ $\b
而且它是一样的:第一个匹配美元符号,第二个匹配美元符号.
另一个发现:
(美元|美元|\$)\ b
在")"和"\ b"之间有一个空白""实际上有效.但是,在所有情况下(如果应该存在非空白字边界),该解决方法可能不可行.
当涉及单词边界时,似乎拒绝找到逃逸的美元符号.
我很想听听你提出的解决这个谜团的建议. - 提前多多谢谢!
考虑字符串"abc?"。根据unicode的分词demo实现,这个字符串应该被拆分成两个词,"abc"和"?"。然而,词边界检测的 3 个不同 Rust 实现(regex,unic-segment,unicode-segmentation)都不一致,并将该字符串分组为一个词。哪种行为是正确的?
作为后续,如果分组行为是正确的,那么以仍然主要尊重单词边界的方式扫描此字符串以查找搜索词“abc”的好方法是什么(目的是检查字符串翻译的有效性) . 我想匹配类似"abc?"但不匹配类似的东西abcdef。
我有一个JavaScript正则表达式,基本上找到两个字母的单词.问题似乎是它将重音字符解释为单词边界.的确,似乎是这样
单词边界("\ b")是两个字符之间的一个点,在它的一边有一个"\ w",另一边有一个"\ W"(按任意顺序),计算出假想的字符字符串的开头和结尾匹配"\ W". AS3 RegExp用于匹配其中包含边界类型字符的单词
从那以后
\ w匹配任何字母数字字符(单词字符),包括下划线([a-zA-Z0-9_]的缩写).\ W匹配任何非单词字符([^ a-zA-Z0-9_]的缩写) http://www.javascriptkit.com/javatutors/redev2.shtml
显然重音字符不被考虑在内.这就像是一个问题Montréal.如果é被认为是单词边界,则al是两个字母的单词.我已经尝试自己定义一个允许重音字符的单词边界,但是看作单词边界甚至不是一个字符,我不知道如何去寻找它.
有帮助吗?
以下是相关的JavaScript代码,userInput使用re_state正则表达式搜索和查找双字母单词:
var re_state = new RegExp("\\b([a-z]{2})[,]?\\b", "mi");
var match_state = re_state.exec(userInput);
document.getElementById("state").value = (match_state)?match_state[1]:"";
Run Code Online (Sandbox Code Playgroud) 我正在使用标准的\b单词边界.但是,它并不像我想要的那样处理点(.)字符.
所以以下正则表达式:
\b(\w+)\b
将匹配cats以及dogs在cats.dog,如果我有一个字符串,它说cats and dogs don't make cats.dogs.
我需要一个单词边界替代方案,只有在以下情况下才匹配整个单词:
有任何想法吗?!
PS我需要这个用于PHP
我需要在unix(bash)中使用egrep(或grep -e)在文件中找到重复的单词
我试过了:
egrep "(\<[a-zA-Z]+\>) \1" file.txt
Run Code Online (Sandbox Code Playgroud)
和
egrep "(\b[a-zA-Z]+\b) \1" file.txt
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,这些都认为重复的事情不是!例如,它认为字符串"单词单词"符合标准,尽管单词边界条件\> 或\b.
word-boundary ×10
regex ×9
javascript ×3
php ×3
unicode ×2
android ×1
bash ×1
diacritics ×1
dollar-sign ×1
grep ×1
mysql ×1
pcre ×1
rust ×1
split ×1
sqlite ×1
unix ×1
utf-8 ×1