Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 从保留重音字符的字符串中删除非字母数字字符_Ruby - Fatal编程技术网

Ruby 从保留重音字符的字符串中删除非字母数字字符

Ruby 从保留重音字符的字符串中删除非字母数字字符,ruby,Ruby,为了执行搜索方法,我需要从字符串中删除字符,如“+”、“/”、“_”等 根据这里的另一个问题,我使用gsub方法得到了这个,问题是它还替代了重音字母,我不想: string.gsub(/[^0-9A-Za-z]/,“”) 编辑:我需要支持的语言是西班牙语和加泰罗尼亚语 有没有办法调整表达式以保留带有重音的字母?借用答案,许多(但不是所有)重音字符的正则表达式字符范围是À-ÿ。因此,要匹配这些,您只需将其添加到现有范围: string.gsub(/[^0-9A-Za-zÀ-ÿ]/, '') 这在

为了执行搜索方法,我需要从字符串中删除字符,如“+”、“/”、“_”等

根据这里的另一个问题,我使用gsub方法得到了这个,问题是它还替代了重音字母,我不想:

string.gsub(/[^0-9A-Za-z]/,“”)

编辑:我需要支持的语言是西班牙语和加泰罗尼亚语

有没有办法调整表达式以保留带有重音的字母?

借用答案,许多(但不是所有)重音字符的正则表达式字符范围是
À-ÿ
。因此,要匹配这些,您只需将其添加到现有范围:

string.gsub(/[^0-9A-Za-zÀ-ÿ]/, '')
这在很大程度上取决于你要找的口音,因为口音太多,很难匹配所有口音。此示例正则表达式将保留例如急性/严重口音,但忽略新月:

puts "I went to a café.".gsub(/[^0-9A-Za-zÀ-ÿ]/, '') # Iwenttoacafé
puts "Ahoj, světe!".gsub(/[^0-9A-Za-zÀ-ÿ]/, '')      # Ahojsvte
这对于您的用例来说可能很好,但是如果您处理的是捷克语文本,您可能需要额外的字符范围来匹配新月。

借用答案,许多(但不是所有)重音字符的正则表达式字符范围是
À-ÿ
。因此,要匹配这些,您只需将其添加到现有范围:

string.gsub(/[^0-9A-Za-zÀ-ÿ]/, '')
这在很大程度上取决于你要找的口音,因为口音太多,很难匹配所有口音。此示例正则表达式将保留例如急性/严重口音,但忽略新月:

puts "I went to a café.".gsub(/[^0-9A-Za-zÀ-ÿ]/, '') # Iwenttoacafé
puts "Ahoj, světe!".gsub(/[^0-9A-Za-zÀ-ÿ]/, '')      # Ahojsvte

这对于您的用例来说可能很好,但是如果您处理的是捷克语文本,您可能需要额外的字符范围来匹配新月。

您还可以使用
POSIX括号表达式。您将在ruby文档中找到所有需要的内容

在您的情况下,您可以使用:

string.gsub(/[^[:alpha:]]/, '')
或:

从文件中:

/[[:alnum:][]/-字母和数字字符

/[:alpha:][]/-字母字符


也可以使用
POSIX括号表达式
。您将在ruby文档中找到所有需要的内容

在您的情况下,您可以使用:

string.gsub(/[^[:alpha:]]/, '')
或:

从文件中:

/[[:alnum:][]/-字母和数字字符

/[:alpha:][]/-字母字符


到目前为止,这里给出的两个答案都是完全错误的

现代unicode中有两种重音:组合和组合变音符号(分解)与Ruby 2.3+一切都很简单:

"Barça".unicode_normalize(:nfc).scan(/\p{L}/)
#⇒ ["B", "a", "r", "ç", "a"]
无论“ç”是如何构造的,作为拉丁语合成的字符,还是作为组合变音符号,上述内容都将起作用

这就是说,要删除所有非字母,需要执行以下操作:

"Barça".unicode_normalize(:nfc).gsub(/[^\p{L}]/, '')

在Ruby 2.3之前,没有标准的方法将字符串规范化为组合形式,而对于“mañana”,简单的范围
À..ÿ
可以工作(组合形式),“mañana”则不行(组合变音符号)您可以通过将两者复制粘贴到您的
irb
shell中来确保两者之间存在差异。

到目前为止,这里给出的两个答案都是完全错误的

现代unicode中有两种重音:组合和组合变音符号(分解)与Ruby 2.3+一切都很简单:

"Barça".unicode_normalize(:nfc).scan(/\p{L}/)
#⇒ ["B", "a", "r", "ç", "a"]
无论“ç”是如何构造的,作为拉丁语合成的字符,还是作为组合变音符号,上述内容都将起作用

这就是说,要删除所有非字母,需要执行以下操作:

"Barça".unicode_normalize(:nfc).gsub(/[^\p{L}]/, '')


在Ruby 2.3之前,没有标准的方法将字符串规范化为组合形式,而对于“mañana”,简单的范围
À..ÿ
可以工作(组合形式),“mañana”则不行(组合变音符号)您可以通过将两者复制粘贴到您的
irb
shell中来确保它们之间存在差异。

您特别希望保留哪些重音?您使用的是什么语言?西班牙语和加泰罗尼亚语,因此我需要同时支持尖锐和严重重音
string.gsub(/[[:punct:]]/,'')
删除标点符号。您特别希望保留哪些重音?你在用什么语言?西班牙语和加泰罗尼亚语,所以我需要同时支持尖锐和严重的口音
string.gsub(/[:punct:]]/,'')
删除标点符号。看起来很有希望,但不管用,
“tórica”。gsub(/[^[:alnum]]/,'')
返回
“a”
很抱歉,示例中缺少一个分号
。现在已经编辑好了。谢谢,可以了。我会接受mudasobwa,因为他之前已经回答过了,仍然很感谢你的回答。@ErnestoG不,这不起作用。试试
“mañana”.gsub(/[^[:alpha:]]/,'')
@ErnestoG这并不奇怪,我在回答中解释了这种行为。当你用键盘输入时,它会吐出已经组合好的值。甚至这些字符串的长度也不同:
%w | mañana mañana | map(&:length)#⇒[7,6]
。这就是使用unicode\u normalize(:nfc)
的原因,也是我在这里写其他答案的原因。看起来很有希望,但它不起作用,
“tórica”。gsub(/[^[:alnum]]/,”)
返回
“a”
很抱歉,我在示例中缺少一个分号
。现在已经编辑好了。谢谢,可以了。我会接受mudasobwa,因为他之前已经回答过了,仍然很感谢你的回答。@ErnestoG不,这不起作用。试试
“mañana”.gsub(/[^[:alpha:]]/,'')
@ErnestoG这并不奇怪,我在回答中解释了这种行为。当你用键盘输入时,它会吐出已经组合好的值。甚至这些字符串的长度也不同:
%w | mañana mañana | map(&:length)#⇒[7,6]
。这就是使用unicode规范化(:nfc)的原因,也是我在这里写其他答案的原因。试试
“mañana”
。试试
“mañana”
。这个答案似乎比我的更明智、更全面。以后我必须记住这一点;谢谢谢谢,我必须使用
“Barça”.unicode_规范化(:nfc).gsub(/[^\p{L}]/,'')