标签: word-boundary

在utf-8中的php正则表达式字边界匹配

我在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.

php regex pcre utf-8 word-boundary

12
推荐指数
2
解决办法
6976
查看次数

MySQL REGEXP字边界[[:<:]] [[:>:]]和双引号

我试图将一些全字表达式与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?或者这不可能吗?

regex mysql word-boundary

9
推荐指数
3
解决办法
1万
查看次数

正则表达式以匹配不同Unicode脚本之间的边界

正则表达式引擎具有"零宽度"匹配的概念,其中一些对于查找单词边缘很有用:

  • \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

8
推荐指数
1
解决办法
679
查看次数

如何在Sqlite Android中实现单词边界?

我想实现以下(全文搜索),

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)

regex sqlite android word-boundary

8
推荐指数
1
解决办法
1781
查看次数

Word边界将与Javascript中的开头或结尾不匹配

我用这段代码得到了意想不到的结果:

'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)

单词边界标记是否也与开头和结尾相匹配?

编辑:我需要正则表达式本身是一个字符串因为我注入变量.

javascript regex word-boundary

7
推荐指数
1
解决办法
3087
查看次数

正则表达式中带有单词边界"\ b"的美元符号"\ $"(PHP/JavaScript)

我知道在正则表达式中涉及美元符号"$"的问题(这里:在PHP和JavaScript中)已被多次讨论过:是的,我知道我需要在它前面添加一个反斜杠"\"(取决于字符串处理甚至两个),但匹配美元符号的正确方法是"\ $"....去过那里,做到了,工作正常.


但这是我的新问题:美元符号"\ $"旁边标有"\ b"的字边界....我可以在regexpal.com上轻松复制以下示例.

让我们从以下文本开始搜索:

50美元

50美元

50美元

50美元

我的正则表达式应该找到"USD","Dollar"或"$".很容易:让我们试试吧

(USD |美元|\$)

成功:它找到"$","USD"和"Dollar"两种情况,包括"美元".

但是,让我们尝试通过在多项选择之后添加单词边界来跳过"美元":

(USD |美元|\$)\ b

这就是麻烦:"USD"匹配,"Dollar"匹配,"Dollars"被拒绝......但单曲,正确反击(或逃脱)"$"也被拒绝,尽管这只是一秒钟之前.

它与括号内的多项选择无关:试试吧

\ $

\ $\b

而且它是一样的:第一个匹配美元符号,第二个匹配美元符号.


另一个发现:

(美元|美元|\$)\ b

在")"和"\ b"之间有一个空白""实际上有效.但是,在所有情况下(如果应该存在非空白字边界),该解决方法可能不可行.


当涉及单词边界时,似乎拒绝找到逃逸的美元符号.

我很想听听你提出的解决这个谜团的建议. - 提前多多谢谢!

javascript php regex word-boundary dollar-sign

7
推荐指数
1
解决办法
1262
查看次数

这个混合字符串如何在 unicode 单词边界上拆分

考虑字符串"abc?"。根据unicode的分词demo实现,这个字符串应该被拆分成两个词,"abc""?"。然而,词边界检测的 3 个不同 Rust 实现(regexunic-segmentunicode-segmentation不一致,并将该字符串分组为一个词。哪种行为是正确的?

作为后续,如果分组行为是正确的,那么以仍然主要尊重单词边界的方式扫描此字符串以查找搜索词“abc”的好方法是什么(目的是检查字符串翻译的有效性) . 我想匹配类似"abc?"但不匹配类似的东西abcdef

unicode split word-boundary rust

7
推荐指数
1
解决办法
141
查看次数

如何制作一个将重音字符考虑在内的正则表达式?

我有一个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)

javascript regex diacritics word-boundary

6
推荐指数
2
解决办法
2736
查看次数

正则表达式单词边界替代

我正在使用标准的\b单词边界.但是,它并不像我想要的那样处理点(.)字符.

所以以下正则表达式:

\b(\w+)\b

将匹配cats以及dogscats.dog,如果我有一个字符串,它说cats and dogs don't make cats.dogs.

我需要一个单词边界替代方案,只有在以下情况下才匹配整个单词:

  1. 它不包含点(.)字符
  2. 它由每侧至少一个space()字符封装

有任何想法吗?!

PS我需要这个用于PHP

php regex word-boundary

6
推荐指数
1
解决办法
2327
查看次数

如何使用grep/egrep在文件中找到重复的单词?

我需要在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.

regex unix bash grep word-boundary

6
推荐指数
1
解决办法
8355
查看次数