我在Java 1.6中使用Java正则表达式(尤其是解析数字输出)并且找不到\b("单词边界")的精确定义.我假设这-12将是一个"整数字"(匹配 \b\-?\d+\b),但似乎这不起作用.我很想知道匹配空格分隔数字的方法.
例:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Run Code Online (Sandbox Code Playgroud)
返回:
true
false
true
Run Code Online (Sandbox Code Playgroud) 我有一个正则表达式,我用它来查找给定内容块中的所有单词,不区分大小写,包含在存储在数据库中的词汇表中.这是我的模式:
/($word)/i
Run Code Online (Sandbox Code Playgroud)
问题是,如果我使用/(Foo)/i那么像Food匹配的话.在单词的两边都需要有空格或单词边界.
Foo如果单词在句子的开头,中间或结尾处是单词时,如何修改我的表达式以仅匹配单词?
PostgreSQL支持\b吗?
我正在尝试,\bAB\b但它不匹配任何东西,而是(\W|^)AB(\W|$).这两个表达式基本相同,不是吗?
string = c("apple", "apples", "applez")
grep("apple", string)
Run Code Online (Sandbox Code Playgroud)
这将为我提供所有三个元素的索引string.但我希望在单词"apple"上完全匹配(即我只想grep()返回索引1).
我遇到了与REGEXP_LIKE匹配单词边界的问题.以下查询返回单行,如预期的那样.
select 1 from dual
where regexp_like('DOES TEST WORK HERE','TEST');
Run Code Online (Sandbox Code Playgroud)
但我也希望在字边界上匹配.因此,添加"\ b"字符会给出此查询
select 1 from dual
where regexp_like('DOES TEST WORK HERE','\bTEST\b');
Run Code Online (Sandbox Code Playgroud)
运行此返回零行.有任何想法吗?
与字边界相比,正则表达式(\ B)中的非字边界是什么?
在JavaScript中:
"ab abc cab ab ab".replace(/\bab\b/g, "AB");
Run Code Online (Sandbox Code Playgroud)
正确地给了我:
"AB abc cab AB AB"
Run Code Online (Sandbox Code Playgroud)
当我使用utf-8字符时:
"?? ??? ??? ?? ??".replace(/\b??\b/g, "AB");
Run Code Online (Sandbox Code Playgroud)
在字边界运营商似乎并没有工作:
"?? ??? ??? ?? ??"
Run Code Online (Sandbox Code Playgroud)
这个问题有方法解决吗?
例如,在本文中:
Lorem ipsum dolor坐下来,精致的adipistur elit.Nunc eu tellus vel nunc pretium lacinia.Proin sed lorem.Cras sed ipsum.Nunc a libero quis risus sollicitudin imperdiet.
我想在'ipsum'之后匹配这个词.
我\b在正则表达式中使用和希腊字符有困难.
在这个例子中 [a-zA-Z??-??-?]*成功地标记了我想要的所有单词(希腊语和英语).现在考虑我想找到2个字母的单词.对于英语,我使用这样的东西:
\b[a-zA-Z]{2}\b.你能帮我写一个正则表达式,成功用2个字母标记希腊语单词吗?(为什么?我的最终目标是删除它们).
使用的文字:
希腊单调:Τογάρούνκαιπαρ 'υμίνλεγόμενον,ώςποτεΦαέθωνΗλίουπαίςτοτουπατρόςάρμαζεύξαςδιατομήδυνατόςείναικατάτηντουπατρόςοδόνελαύνειντατ' επίτηςγήςξυνέκαυσεκαιαυτόςκεραυνωθείςδιεφθάρη,τούτομύθουμένσχήμαέχον λέγεται,τοδέαληθέςεστιτωνπερίγήνκαικατ'ουρανόνιόντωνπαράλλαξιςκαιδιάμακρόνχρόνονγιγνομένητωνεπίγήςπυρίπολλώφθορά.
希腊POLYTONIC:Τὸγὰροὖνκαὶπαρ 'ὑμῖνλεγόμενον,ὥςποτεΦαέθωνἩλίουπαῖςτὸτοῦπατρὸςἅρμαζεύξαςδιὰτὸμὴδυνατὸςεἶναικατὰτὴντοῦπατρὸςὁδὸνἐλαύνειντὰτ' ἐπὶτῆςγῆςξυνέκαυσεκαὶαὐτὸςκεραυνωθεὶςδιεφθάρη,τοῦτομύθουμὲνσχῆμαἔχον λέγεται,τὸδὲὲληθέςἐστιτῶνπερὶγῆνκαὶκατ'οὐρανὸνἰόντωνπαράλλαξιςκαὶδιὰμακρὸνχρόνονγιγνομένητῶνἐπὶτῆςγῆςπυρὶπολλῷφθορά.
英语:事实上,在你们国家和我们的故事中讲述了这个故事,曾经的赫利俄斯之子帕森曾经用他的父亲的战车,并且,因为他无法沿着他父亲的路线驾驶它.烧毁了地球上的所有东西,他自己也被雷电摧毁了 - 据说,这个故事具有传说的风格,但它的真实性在于天体中身体的移动.它绕着地球移动,并通过猛烈的火焰摧毁地球上的东西,这种火焰会长时间地复发.
到目前为止我尝试过的:
// 1
txt = txt.replace(/\b[a-zA-Z??-??-?]{2}\b/g, '');
// 2
tokens = txt.split(/\s+/);
txt = tokens.filter(function(token){ return token.length > 2}).join(' ');
// 3
tokens = txt.split(' ');
txt = tokens.filter(function(token){ return token.length != 3}).join(' ') );
Run Code Online (Sandbox Code Playgroud)
我在这里提出了2和3的问题:Javascript - 正则表达式 - 如何删除指定长度的单词
编辑
阅读:
我正在研究将高棉语(柬埔寨语)的长行分成单个单词(UTF-8)的解决方案.高棉语不会在单词之间使用空格.有一些解决方案,但它们远远不够(这里和这里),那些项目已经落伍了.
以下是需要拆分的高棉样本行(它们可能比这更长):
ចូរសរសើរដល់ទ្រង់ទ្រង់បានប្រទានទាំងអស់នោះមកដល់រូបដោយព្រោះអង្គព្រះយេស៊ូវហើយដែលមិនអាចរកការទាំងអស់នោះដោយសារការប្រព្រឹត្តរបស់អ្នកឡើយឡើយ.
创建分裂高棉语的可行解决方案的目标有两个:它将鼓励那些使用高棉遗留(非Unicode)字体转换为Unicode(具有许多好处)的人,并且它将使遗留的高棉语字体能够被导入进入Unicode以快速使用拼写检查器(而不是手动浏览和分割单词,使用大文档,可能需要很长时间).
我不需要100%的准确度,但速度很重要(特别是因为需要分成高棉语的行可能很长).我愿意接受建议,但目前我有一大堆高棉语单词正确分割(有一个不间断的空格),我创建了一个单词概率词典文件(frequency.csv)作为字典用于分词器.
我在这里发现这个使用Viterbi算法的 python代码,它应该运行得很快.
import re
from itertools import groupby
def viterbi_segment(text):
probs, lasts = [1.0], [0]
for i in range(1, len(text) + 1):
prob_k, k = max((probs[j] * word_prob(text[j:i]), j)
for j in range(max(0, i - max_word_length), i))
probs.append(prob_k)
lasts.append(k)
words = []
i = len(text)
while 0 < i:
words.append(text[lasts[i]:i])
i = lasts[i]
words.reverse()
return words, probs[-1]
def word_prob(word): return dictionary.get(word, 0) / total
def words(text): return re.findall('[a-z]+', …Run Code Online (Sandbox Code Playgroud) python nlp word-boundary text-segmentation southeast-asian-languages
word-boundary ×10
regex ×9
javascript ×3
boundary ×1
grep ×1
gsub ×1
lookbehind ×1
nlp ×1
oracle ×1
postgresql ×1
python ×1
r ×1
unicode ×1
utf-8 ×1