scala 正则表达式匹配_Scala教程–正则表达式,匹配

scala 正则表达式匹配

前言

这是面向初学者的Scala教程的第5部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。

这篇文章是有关正则表达式(regexes)的两个文章中的第一篇,正则表达式对于各种编程任务,尤其是计算语言学任务都是必不可少的。 本教程介绍了如何在Scala中使用它们,前提是读者已经熟悉正则表达式语法。 它展示了如何在Scala中创建正则表达式,以及如何将它们与Scala强大的模式匹配功能一起使用,尤其是在变量表达式和匹配表达式中的情况下。

创建正则表达式

Scala提供了一种非常简单的创建正则表达式的方法:只需将正则表达式定义为字符串,然后在其上调用r方法。 下面定义了表征字符串语言的正则表达式 a ^ mb ^ n (一个或多个a后面跟一个或多个b ,不一定与a的数目相同)。

scala> val AmBn = "a+b+".r
AmBn: scala.util.matching.Regex = a+b+

要使用元字符,例如\ s\ w\ d ,您必须转义斜杠或使用多引号字符串,这被称为原始字符串。 以下是两种等效的编写正则表达式的方法,该正则表达式覆盖一系列单词字符的字符串和一个数字序列。

scala> val WordDigit1 = "\\w+\\d+".r
WordDigit1: scala.util.matching.Regex = \w+\d+
 
scala> val WordDigit2 = """\w+\d+""".r
WordDigit2: scala.util.matching.Regex = \w+\d+

最好转义还是使用原始字符串取决于上下文。 例如,使用上面的代码,我将使用原始字符串。 但是,对于使用正则表达式在空白字符上拆分字符串,转义在某种程度上是可取的。

scala> val adder = "We're as similar as two dissimilar things in a pod.\n\t-Blackadder"
adder: java.lang.String =
We're as similar as two dissimilar things in a pod.
-Blackadder
 
scala> adder.split("\\s+")
res2: Array[java.lang.String] = Array(We're, as, similar, as, two, dissimilar, things, in, a, pod., -Blackadder)
 
scala> adder.split("""\s+""")
res3: Array[java.lang.String] = Array(We're, as, similar, as, two, dissimilar, things, in, a, pod., -Blackadder)

关于命名的注意事项:Scala中的约定是将变量名的首字母大写用于正则表达式对象。 这使它们与在match语句中使用模式匹配一​​致,如下所示。

与正则表达式匹配

我们在上面看到,在String上使用r方法将返回一个正则表达式对象的值(有关下面的scala.util.matching部分的更多信息)。 您实际上如何使用这些Regex对象做有用的事情? 有很多方法。 对于非计算语言学家来说,最漂亮的,也许是最常见的,是将它们与Scala的标准模式匹配功能结合使用。 让我们考虑一下解析名称并将其转换为有用的数据结构以完成各种有用的事情的任务。

scala> val Name = """(Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r
Name: scala.util.matching.Regex = (Mr|Mrs|Ms)\. ([A-Z][a-z]+) ([A-Z][a-z]+)
 
scala> val Name(title, first, last) = "Mr. James Stevens"
title: String = Mr
first: String = James
last: String = Stevens
 
scala> val Name(title, first, last) = "Ms. Sally Kenton"
title: String = Ms
first: String = Sally
last: String = Kenton

注意在Array和List等类型上与模式匹配的相似性。

scala> val Array(title, first, last) = "Mr. James Stevens".split(" ")
title: java.lang.String = Mr.
first: java.lang.String = James
last: java.lang.String = Stevens
 
scala> val List(title, first, last) = "Mr. James Stevens".split(" ").toList
title: java.lang.String = Mr.
first: java.lang.String = James
last: java.lang.String = Stevens

当然,请注意此处的“。” 被正则表达式切除时被捕获。 与正则表达式相比,更实质性的区别在于,它只接受格式正确的字符串,而拒绝其他字符串,这与简单的拆分和与Array的匹配不同。

scala> val Array(title, first, last) = "221B Baker Street".split(" ")
title: java.lang.String = 221B
first: java.lang.String = Baker
last: java.lang.String = Street
 
scala> val Name(title, first, last) = "221B Baker Street"
scala.MatchError: 221B Baker Street (of class java.lang.String)
at .<init>(<console>:12)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $export(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:592)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$10.apply(IMain.scala:828)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:31)
at java.lang.Thread.run(Thread.java:680)

当然,这会引起很多抱怨,但是实际上,您通常会(a)绝对确定自己的字符串格式正确,或者(b)将检查这种可能的异常,或者(c)将正则表达式用作匹配表达式中许多选项的一种。

现在,让我们假设输入是适当的。 这意味着我们可以使用map和match表达式轻松地将名称列表作为字符串转换为元组列表。

scala> val names = List("Mr. James Stevens", "Ms. Sally Kenton", "Mrs. Jane Doe", "Mr. John Doe", "Mr. James Smith")
names: List[java.lang.String] = List(Mr. James Stevens, Ms. Sally Kenton, Mrs. Jane Doe, Mr. John Doe, Mr. James Smith)
 
scala> names.map(x => x match { case Name(title, first, last) => (title, first, last) })
res11: List[(String, String, String)] = List((Mr,James,Stevens), (Ms,Sally,Kenton), (Mrs,Jane,Doe), (Mr,John,Doe), (Mr,James,Smith))

注意名称正则表达式中组的关键用法:组的数量等于匹配中要初始化的变量的数量。 先生,太太女士的替代品需要第一组。 没有其他组,我们会收到错误消息。 (从这里开始,我将缩短MatchError输出。)

scala> val NameOneGroup = """(Mr|Mrs|Ms)\. [A-Z][a-z]+ [A-Z][a-z]+""".r
NameOneGroup: scala.util.matching.Regex = (Mr|Mrs|Ms)\. [A-Z][a-z]+ [A-Z][a-z]+
 
scala> val NameOneGroup(title, first, last) = "Mr. James Stevens"
scala.MatchError: Mr. James Stevens (of class java.lang.String)

当然,我们仍然可以匹配第一组。

scala> val NameOneGroup(title) = "Mr. James Stevens"
title: String = Mr

如果我们朝另一个方向发展,创建更多的组,以便例如可以在各个标题中共享“ M”,该怎么办? 这是一个尝试。

scala> val NameShareM = """(M(r|rs|s))\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r
NameShareM: scala.util.matching.Regex = (M(r|rs|s))\. ([A-Z][a-z]+) ([A-Z][a-z]+)
 
scala> val NameShareM(title, first, last) = "Mr. James Stevens"
scala.MatchError: Mr. James Stevens (of class java.lang.String)

发生的事情是创建了一个新组,因此现在有四个组可以匹配。

scala> val NameShareM(title, titleEnding, first, last) = "Mr. James Stevens"
title: String = Mr
titleEnding: String = r
first: String = James
last: String = Stevens
 
scala> val NameShareM(title, titleEnding, first, last) = "Mrs. Sally Kenton"
title: String = Mrs
titleEnding: String = rs
first: String = Sally
last: String = Kenton

因此,存在子匹配的组捕获。 要阻止(r | rs | s)部分创建匹配组,同时仍然可以将其用于组合其他选择项,请使用 :运算符。

scala> val NameShareMThreeGroups = """(M(?:r|rs|s))\. ([A-Z][a-z]+) ([A-Z][a-z]+)""".r
NameShareMThreeGroups: scala.util.matching.Regex = (M(?:r|rs|s))\. ([A-Z][a-z]+) ([A-Z][a-z]+)
 
scala> val NameShareMThreeGroups(title, first, last) = "Mr. James Stevens"
title: String = Mr
first: String = James
last: String = Stevens

至此,共享M并没有节省太多(Mr | Mrs | Ms) ,但是在很多情况下这是非常有用的。

我们还可以使用正则表达式反向引用。 假设我们要匹配“ John Bohn先生 ”,“ Joe Doe先生 ”和“ Jill Hill夫人 ”等名字。

scala> val RhymeName = """(Mr|Mrs|Ms)\. ([A-Z])([a-z]+) ([A-Z])\3""".r
RhymeName: scala.util.matching.Regex = (Mr|Mrs|Ms)\. ([A-Z])([a-z]+) ([A-Z])\3
 
scala> val RhymeName(title, firstInitial, firstRest, lastInitial) = "Mr. John Bohn"
title: String = Mr
firstInitial: String = J
firstRest: String = ohn
lastInitial: String = B

然后,我们可以将事情拼凑起来,以获得我们想要的名称。

scala> val first = firstInitial+firstRest
first: java.lang.String = John
 
scala> val last = lastInitial+firstRest
last: java.lang.String = Bohn

但是我们可以通过使用嵌入式组并仅将其匹配结果与下划线_相去掉来做得更好。

scala> val RhymeName2 = """(Mr|Mrs|Ms)\. ([A-Z]([a-z]+)) ([A-Z]\3)""".r
RhymeName2: scala.util.matching.Regex = (Mr|Mrs|Ms)\. ([A-Z]([a-z]+)) ([A-Z]\3)
 
scala> val RhymeName2(title, first, _, last) = "Mr. John Bohn"
title: String = Mr
first: String = John
last: String = Bohn

注意 :我们不能将?:运算符与([az] +)一起使用来停止匹配,因为稍后我们需要该字符串与\ 3进行匹配。

使用正则表达式通过模式匹配进行分配需要完整的字符串匹配。

scala> val Name(title, first, last) = "Mr. James Stevens"
title: String = Mr
first: String = James
last: String = Stevens
 
scala> val Name(title, first, last) = "Mr. James Stevens walked to the door."
scala.MatchError: Mr. James Stevens walked to the door. (of class java.lang.String)

这是在匹配表达式中使用它们的关键方面。 考虑一个需要能够解析不同格式的电话号码的应用程序,例如(123)555-5555123-555-5555 。 这是这两种模式的正则表达式,以及它们用于解析这些数字的正则表达式。

scala> val Phone1 = """\((\d{3})\)\s*(\d{3})-(\d{4})""".r
Phone1: scala.util.matching.Regex = \((\d{3})\)\s*(\d{3})-(\d{4})
 
scala> val Phone2 = """(\d{3})-(\d{3})-(\d{4})""".r
Phone2: scala.util.matching.Regex = (\d{3})-(\d{3})-(\d{4})
 
scala> val Phone1(area, first3, last4) = "(123) 555-5555"
area: String = 123
first3: String = 555
last4: String = 5555
 
scala> val Phone2(area, first3, last4) = "123-555-5555"
area: String = 123
first3: String = 555
last4: String = 5555

我们当然可以使用单个正则表达式,但是我们将同时使用这两个正则表达式,以便它们可以在match表达式中用作单独的case语句,该match表达式是使用电话号码的字符串表示形式并返回a的函数的一部分三个字符串的元组(从而将数字标准化)。

def normalizePhoneNumber (number: String) = number match {
  case Phone1(x,y,z) => (x,y,z)
  case Phone2(x,y,z) => (x,y,z)
}

每场比赛所采取的行动只是将单独的值打包到一个Tuple3中 -如果人们正在寻找国家/地区代码,与多个国家打交道等,那么可能会做更多有趣的事情。这里的目的是看看正则表达式如何用于案例来捕获值并将它们分配给局部变量,每次都适合于引入的字符串形式。(我们将在后面的教程中看到如何保护这种方法免受非电话输入的影响)数字等。)

现在有了该功能,我们可以轻松地将其应用于代表电话号码的字符串列表,并仅过滤掉特定区域的字符串。

scala> val numbers = List("(123) 555-5555", "123-555-5555", "(321) 555-0000")
numbers: List[java.lang.String] = List((123) 555-5555, 123-555-5555, (321) 555-0000)
 
scala> numbers.map(normalizePhoneNumber)
res16: List[(String, String, String)] = List((123,555,5555), (123,555,5555), (321,555,0000))
 
scala> numbers.map(normalizePhoneNumber).filter(n => n._1=="123")
res17: List[(String, String, String)] = List((123,555,5555), (123,555,5555))

从字符串构建正则表达式

有时,人们希望从较小的组成部分中构建正则表达式,例如,定义什么是名词短语,然后搜索名词短语的序列。 为此,我们首先必须看到创建正则表达式的较长形式。

scala> val AmBn = new scala.util.matching.Regex("a+b+")
AmBn: scala.util.matching.Regex = a+b+

这是在这些教程中我们第一次使用保留字new显式创建对象。 稍后我们将更详细地介绍对象,但是您现在需要知道的是Scala具有很多默认情况下不可用的功能。 通常,我们一直在处理诸如字符串,整数,双精度型,列表等之类的东西,并且在大多数情况下,它们似乎只是“字符串”,整数,双精度型和列表之类的东西。 但是,事实并非如此:实际上,它们被完全指定为:

  • java.lang.String
  • scala.Int
  • 斯卡拉
  • 标量表

而且,对于最后一个, scala.List是一种类型,实际上由scala.collection.immutable.List中的具体实现支持。 因此,当您仅看到“列表”时,Scala实际上隐藏了一些细节。 最重要的是,它使得使用非常普通的类型而几乎不必大惊小怪。

什么scala.util.matching.Regex告诉你的是,正则表达式类是scala.util.matching包的一部分(和scala.util.matchingscala.util的子包,这本身就是的子包包)。 幸运的是,您不需要每次使用Regex时都键入scala.util.matching :只需使用import语句,然后使用Regex而无需额外的程序包规范。

scala> import scala.util.matching.Regex
import scala.util.matching.Regex
 
scala> val AmBn = new Regex("a+b+")
AmBn: scala.util.matching.Regex = a+b+

另一件事要解释的是部分。 同样,我们稍后将更详细地介绍这一点,但是现在请按照以下方式进行考虑。 Regex类就像生产正则表达式对象的工厂,而您请求(订购)这些对象之一的方式是说“ new Regex(…) ”,其中表示应用于定义...的属性的字符串。该对象。 实际上,在创建Lists,Ints和Doubles时,您已经做了很多事情,但是,对于那些核心类型,Scala提供了特殊的语法来简化其创建和使用。

好的,但是当可以使用“ a + b +”。r进行相同的操作时,为什么还要使用新的Regex(“ a + b +”)呢? 原因如下:后者需要提供完整的字符串,但是前者可以由多个String变量构建。 举例来说,假设您想要一个正则表达式,匹配以下形式的字符串:“ the / a dog / cat / mouse / bird chaed / ate the / a dog / cat / mouse / bird ”,例如“ dog doged the cat ”和“ 猫追了那只鸟 。” 以下可能是第一次尝试。

scala> val Transitive = "(a|the) (dog|cat|mouse|bird) (chased|ate) (a|the) (dog|cat|mouse|bird)".r
Transitive: scala.util.matching.Regex = (a|the) (dog|cat|mouse|bird) (chased|ate) (a|the) (dog|cat|mouse|bird)

这是可行的,但是我们也可以通过使用包含定义正则表达式的String的变量(但它本身不是 Regex对象本身)并使用它构建正则表达式,而无需重复两次相同的表达式来构建它。

scala> val nounPhrase = "(a|the) (dog|cat|mouse|bird)"
nounPhrase: java.lang.String = (a|the) (dog|cat|mouse|bird)
 
scala> val Transitive = new Regex(nounPhrase + " (chased|ate) " + nounPhrase)
Transitive: scala.util.matching.Regex = (a|the) (dog|cat|mouse|bird) (chased|ate) (a|the) (dog|cat|mouse|bird)

下一个教程将展示如何使用scala.util.matching包API与正则表达式进行更广泛的匹配,例如查找多个匹配项并执行替换。

参考: Scala入门程序员第一步,Bcompose博客上JCG合作伙伴 Jason Baldridge的 第5部分

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/10/scala-tutorial-regular-expressions.html

scala 正则表达式匹配

scala正则表达式(一)基础匹配 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组 成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。给定一个正则表达式和另一个字符串 ,我们可以达到如下的目的: 1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”); 2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。 每一次 阅读详情

相关推荐

scala正则匹配

val pattern18 = "max[\\w|.]*".r // 上面不包括小数点 我们这里加个小数情况如结果成 如 max124as,max1234,max124,maxaava max124as,max1234.124abc,max124.1,maxaava.254。println((pattern1 findAllIn str).mkString(",")) // 使用逗号 , 连接返回结果 //运行结果Scala,Scala

互联网知识分享 578

Scala教程正则表达式匹配

前言 这是面向初学者的Scala教程的第5部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 这篇文章是有关正则表达式(regexes)的两个文章中的第一篇,正则表达式对于广泛的编程任务,尤其是计算语言学任务至关重要。 本教程介绍了如何在Scala中使用它们,...

607

Scala基础教程--10--模式匹配与正则表达

1. 掌握模式匹配相关内容 2. 掌握option类型及偏函数的用法 3. 掌握异常处理的用法 4. 理解正则表达式的运用 5. 理解提取器的用法 6. 掌握随机职业案例

kc44601的博客 1003

Scala教程使用scala.util.matching API进行正则表达式匹配和替换

前言 这是初学者接触Scala教程的第6部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 这篇文章是关于正则表达式(regexes)的第二篇,对许多编程任务,尤其是对计算语言学任务而言,必不可少。 如果您还没有阅读过,则可能要从有关regexes的第一篇文...

998

scala模式匹配 if_Scala教程使用if-else块和匹配条件执行

scala模式匹配 if 前言 这是面向初学者的Scala教程的第3部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 有条件的 变量来了,变量就去了,根据输入,它们取不同的值。 我们通常需要根据这些值制定不同的行为。 例如,让我们模拟奥斯丁的一家酒吧招标,该酒...

1125

Scala教程使用if-else块和匹配条件执行

前言 这是面向初学者的Scala教程的第3部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 有条件的 变量来了,变量就去了,根据输入,它们取不同的值。 我们通常需要根据这些值制定不同的行为。 例如,让我们模拟奥斯丁的一家酒吧招标,该酒吧必须确保他不给21岁以...

891

Scala教程地图,集,groupBy,选项,展平,flatMap

前言 这是面向初学者的Scala教程的第7部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 列表(以及其他序列数据结构,例如Ranges和Arrays)使您可以按有序的方式对对象集合进行分组:您可以通过索引列表中的元素位置来访问列表中的元素,或者一遍又一遍地...

617

Scala教程迭代,用于表达式,产量,图,过滤器,计数

前言 这是面向初学者的Scala教程的第4部分。 该博客上还有其他文章,您可以在我正在为其创建的计算语言学课程的链接页面上找到这些链接和其他资源。 此外,您可以在“ JCG Java教程”页面上找到本教程和其他教程系列。 本教程背离了前三个教程的初学者性质,因此对于已经具有另一种语言编程经验的读者来说,这可能会更加有趣。 (不过,另请参阅第3部分中有关在Scala中使用匹配的部分 。)...

292

Scala

Scala 1、介绍 ScalaScalable Language 的简写,是一门多范式的编程语言。 联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计Scala。 2、特性 (1)面向对象特性 Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。 类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。 (2)函数式编程 Scala也是一种函数式语言,其函数也

ITWUYI的博客 330

scala快速入门--Option类型、偏函数、正则表达式、异常处理、提取器、泛型的使用方法

scala快速入门Option类型、偏函数、正则表达式、异常处理、提取器的使用方法 文章目录scala快速入门--Option类型、偏函数、正则表达式、异常处理、提取器的使用方法1、Option类型2、偏函数3、正则表达式4、异常处理4.1、捕获异常4.2、抛出异常5、提取器(Extractor)5.1、定义提取器6、泛型6.1、定义一个泛型方法6.2、泛型类6.3、泛型的上下界6.3.1、上...

Mr_Yang888的博客 512

scala笔记攻略

scala学习笔记scala的简单介绍scala的基本特性scala的安装与配置合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 scala的简单介绍 ScalaScalable Language 的简写,是一门多范式的编程语言。集成面

qq_45036013的博客 288

scala高级

** .Mixin混编 当某个特质被用于组合类时,被称为混入; Java:当一个类有接口的时候称为混入; trait可以继承自类; 类实现接口在java中使用(implements),在scala中使用with; 一个类只能有一个父类但是可以有多个混入(分别使用关键字extend和with) 混入和某个父类可能有相同的父类 高阶函数 -高阶函数是指使用其他函数作为参数、或者返回一个函数作...

qq_35968375的博客 1482

Scala学习笔记

Spark学习笔记

Saniana的博客 282

scala简介和安装

一、scala概述 Scala 官网:https://www.scala-lang.org/ ps:po一张官网首页截图(为什么来这么一张呢?因为我觉得UI还挺美观的哈哈,请原谅我的直男审美) 1、什么是 Scala Scala 是一种多范式的编程语言,其设计的初衷是要集成面向 对象编程和函数式编程的各种特性。Scala 运行于 Java 平台 (Java虚拟机),并兼容现有的 Java 程序...

墨殇 240

scala笔记-基础语法(1)

声明变量 ·声明val变量:可以声明val变量来存放表达式的计算结果。 eg:val result = 1 + 1,后续这些常量是可以继续使用的,eg: 2 * result ·但是常量声明后,是无法改变它的值的,eg:result = 1,会返回error: reassignment to val的错误信息。 ·声明var变量:如果要声明值可以改变的引用,可以使用var变量。 eg:val my...

我见青山多妩媚,料青山见我应如是 385

BFG Repo-Cleaner源码深度解析:Scala如何实现10-720倍性能优化的Git仓库清理神器

BFG Repo-Cleaner是一个用Scala编写的高性能Git仓库清理工具,它能够像git-filter-branch一样移除大型或问题文件,但速度要快得多。这个工具专门用于清理Git仓库中的大文件和敏感数据,通过Scala语言的并发特性和JGit库的深度优化,实现了惊人的性能提升。 ## 🔥 为什么BFG比git-filter-branch快10-720倍? BFG Repo-Cle

gitblog_00089的博客 977

如何通过tiktoken o200k_base编码技术解决多模态AI文本处理瓶颈

在当今多语言、多模态AI应用日益复杂的背景下,传统BPE编码器面临着词汇表覆盖不足、多语言混合处理效率低下、特殊符号编码混乱等核心挑战。tiktoken o200k_base作为OpenAI最新推出的200,000词汇表规模的BPE编码技术,通过创新的正则表达式设计和优化的词元分配策略,为GPT-4o、o1、o3等新一代AI模型提供了革命性的文本处理解决方案。该技术专为需要处理混合语言文本、代码片

gitblog_00979的博客 341
上一篇: scala编程_2012年的Scala? 决定是否投资编程语言
下一篇: scala pattern_Scala中的DI:Cake Pattern的优缺点
danpie3295
博客等级 码龄9年 13粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值