如何在JavaScript中使用支持Unicode的正则表达式?例如,应该有类似于\ w的东西可以匹配字母或标记类别中的任何代码点(不仅仅是ASCII代码),并且希望像[[P*]]这样的过滤器用于标点符号等.
许多现代正则表达式实现将\w字符类简写解释为"任何字母,数字或连接标点符号"(通常为下划线).这样一来,像一个正则表达式\w+像火柴的话hello,élève,GOÄ_432或gefräßig.
不幸的是,Java没有.在Java中,\w仅限于[A-Za-z0-9_].这使得像上述那些匹配的单词难以解决.
似乎\b单词分隔符在不应该的位置匹配.
什么是类似.NET,Unicode感知\w或\bJava 的正确等价物?哪些其他快捷方式需要"重写"以使其具有Unicode感知功能?
我需要从字符串'بسماللهالرحمنالرحيم'中删除一些Unicode符号
我知道他们肯定存在于这里.我试过了:
re.sub('([\u064B-\u0652\u06D4\u0670\u0674\u06D5-\u06ED]+)', '', '?????? ??????? ???????????? ??????????')
Run Code Online (Sandbox Code Playgroud)
但它不起作用.字符串保持不变.我究竟做错了什么?
Perl和其他一些当前的正则表达式引擎在正则表达式中支持Unicode属性,例如类别.例如,在Perl中,您可以使用\p{Ll}匹配任意小写字母或p{Zs}任何空格分隔符.在Python的2.x和3.x行中都没有看到对此的支持(有应有的遗憾).是否有人意识到获得类似效果的好策略?欢迎本土解决方案.
如何将法语和俄语西里尔字母字符与正则表达式匹配?我只想做字母字符,没有数字或特殊字符.现在我有
[A-ZA-Z]
我已经通过Stackoverflow上的其他问题阅读了,但仍然没有更接近.对不起,如果已经回答了这个问题,但我没有得到任何建议.
>>> import re
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/xmas/xmas1.jpg')
>>> print m.groupdict()
{'tag': 'xmas', 'filename': 'xmas1.jpg'}
Run Code Online (Sandbox Code Playgroud)
一切都很好,然后我尝试用挪威字符(或更像unicode)的东西:
>>> m = re.match(r'^/by_tag/(?P<tag>\w+)/(?P<filename>(\w|[.,!#%{}()@])+)$', '/by_tag/påske/øyfjell.jpg')
>>> print m.groupdict()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groupdict'
Run Code Online (Sandbox Code Playgroud)
如何匹配典型的unicode字符,例如øæå?我希望能够在上面的标签组和文件名的标签组中匹配这些字符.
python regex unicode non-ascii-characters character-properties
我有一个字符串,我想从中提取3组:
'19 janvier 2012' -> '19', 'janvier', '2012'
Run Code Online (Sandbox Code Playgroud)
月份名称可能包含非ASCII字符,因此[A-Za-z]对我不起作用:
>>> import re
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', u'20 janvier 2012', re.UNICODE).groups()
(u'20', u'janvier', u'2012')
>>> re.search(ur'(\d{,2}) ([A-Za-z]+) (\d{4})', u'20 février 2012', re.UNICODE).groups()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'groups'
>>>
Run Code Online (Sandbox Code Playgroud)
我可以使用,\w但它匹配数字和下划线:
>>> re.search(ur'(\w+)', u'février', re.UNICODE).groups()
(u'f\xe9vrier',)
>>> re.search(ur'(\w+)', u'fé_q23vrier', re.UNICODE).groups()
(u'f\xe9_q23vrier',)
>>>
Run Code Online (Sandbox Code Playgroud)
我尝试使用[:alpha:],但它不起作用:
>>> re.search(ur'[:alpha:]+', u'février', re.UNICODE).groups()
Traceback (most recent call last):
File "<stdin>", …Run Code Online (Sandbox Code Playgroud) 我有一个解析电视剧集文件名的脚本(例如show.name.s01e02.avi),抓取剧集名称(来自www.thetvdb.com API)并自动将它们重命名为更好的名称(显示名称 - [01x02] ]的.avi)
该脚本工作正常,直到你尝试在具有Unicode显示名称的文件上使用它(我从未真正考虑过的事情,因为我拥有的所有文件都是英文的,所以大部分文件全部都在内[a-zA-Z0-9'\-])
如何允许正则表达式匹配重音字符等?目前正则表达式的配置部分看起来像..
config['valid_filename_chars'] = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}"'.,<>`~? """
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars'])
config['name_parse'] = [
# foo_[s01]_[e01]
re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])),
# foo.1x09*
re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.s01.e01, foo.s01_e01
re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.103*
re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
# foo.0103*
re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
]
Run Code Online (Sandbox Code Playgroud) 如何修剪a string(6) " page",第一个空格是0xc2a0不间断空格?
我试过trim()和preg_match('/^\s*(.*)\s*$/u', $key, $m);.
另一个问题:我怎样才能可靠地复制这些字符?它们似乎被转换为"普通"空间,这使得调试变得困难.
在Unicode的不同编码中,例如UTF-16le或UTF-8,字符可能占用2或3个字节.许多Unicode应用程序不像处理所有拉丁字母那样处理Unicode字符的显示宽度.例如,在80列文本中,一行应包含40个中文字符或80个拉丁字母,但大多数应用程序(如Eclipse,Notepad ++和所有知名文本编辑器,我敢于有任何好的例外)只计算每个汉字作为拉丁字母的1宽度.这肯定会使结果格式变得丑陋且不对齐.
例如,制表符宽度为8将得到以下难看的结果(将所有Unicode计为1个显示宽度):
apple 10
banana 7
?? 6
??? 31
pear 16
Run Code Online (Sandbox Code Playgroud)
但是,预期的格式是(将每个汉字计为2个宽度):
apple 10
banana 7
?? 6
??? 31
pear 16
Run Code Online (Sandbox Code Playgroud)
对字符显示宽度的不正确计算使得这些编辑器在进行制表对齐,换行和段重组时完全没用.
虽然,字符的宽度可能会因不同的字体而异,但在固定大小的终端字体的所有情况下,汉字始终是双倍宽度.也就是说,尽管有字体,但每个汉字最好以2宽度显示.
解决方法之一是,我可以通过将编码转换为GB2312来获得正确的宽度,在GB2312编码中每个汉字占用2个字节.但是,GB2312字符集(或GBK字符集)中不存在某些Unicode字符.而且,一般来说,从编码大小(以字节为单位)计算显示宽度并不是一个好主意.
简单地计算(\u0080... \uFFFF)范围内Unicode中的所有字符,因为2宽度也不正确,因为在该范围内还散布着许多1宽度字符.
计算阿拉伯字母和韩文字母的显示宽度时也很困难,因为它们通过任意数量的Unicode代码点构造一个字/字符.
因此,Unicode代码点的显示宽度可能不是整数,我认为没关系,它们可以在实践中基于整数,至少比没有好.
那么,在Unicode标准中是否有与char的首选显示宽度相关的属性?或者任何Java库函数来计算显示宽度?
unicode ×9
regex ×8
python ×5
java ×1
javascript ×1
mbcs ×1
php ×1
ucd ×1
utf-8 ×1
whitespace ×1