免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2524 | 回复: 8
打印 上一主题 下一主题

Scala 新手求助 - 模式查找 [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-14 21:44 |只看该作者 |倒序浏览
本帖最后由 sunzhiguolu 于 2017-05-14 21:49 编辑

示例代码:
  1. //Scala Scripts
  2. import util.matching.Regex

  3. val rgx = new Regex(raw"(\w+)\s+(\w+)")
  4. var animals = "\tcat dog\t"
  5. println(s"original string:{$animals}\n")
  6. val rgx(first, second) = animals
  7. println(s"{$first,$second}\n")
复制代码
执行上述代码,得到一连串的错误提示。如下:
  1. original string:{       cat dog }

  2. scala.MatchError:       cat dog  (of class java.lang.String)
  3.         at Main$anon$1.<init>(test.scala:8)
  4.         at Main$.main(test.scala:1)
  5.         at Main.main(test.scala)
  6.         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  7.         at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
  8.         at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
  9.         at java.lang.reflect.Method.invoke(Unknown Source)
  10.         at scala.reflect.internal.util.ScalaClassLoader.$anonfun$run$2(ScalaClassLoader.scala:98)
  11.         at scala.reflect.internal.util.ScalaClassLoader.asContext(ScalaClassLoader.scala:32)
  12.         at scala.reflect.internal.util.ScalaClassLoader.asContext$(ScalaClassLoader.scala:30)
  13.         at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:129)
  14.         at scala.reflect.internal.util.ScalaClassLoader.run(ScalaClassLoader.scala:98)
  15.         at scala.reflect.internal.util.ScalaClassLoader.run$(ScalaClassLoader.scala:90)
  16.         at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:129)
  17.         at scala.tools.nsc.CommonRunner.run(ObjectRunner.scala:22)
  18.         at scala.tools.nsc.CommonRunner.run$(ObjectRunner.scala:21)
  19.         at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
  20.         at scala.tools.nsc.CommonRunner.runAndCatch(ObjectRunner.scala:29)
  21.         at scala.tools.nsc.CommonRunner.runAndCatch$(ObjectRunner.scala:28)
  22.         at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
  23.         at scala.tools.nsc.ScriptRunner.runCompiled(ScriptRunner.scala:170)
  24.         at scala.tools.nsc.ScriptRunner.$anonfun$runScript$1(ScriptRunner.scala:187)
  25.         at scala.tools.nsc.ScriptRunner.$anonfun$runScript$1$adapted(ScriptRunner.scala:187)
  26.         at scala.tools.nsc.ScriptRunner.$anonfun$withCompiledScript$2(ScriptRunner.scala:156)
  27.         at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:124)
  28.         at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:200)
  29.         at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:63)
  30.         at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:88)
  31.         at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:99)
  32.         at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:104)
  33.         at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
复制代码


有没有更有好的执行方式,让代码可控。



论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2017-05-14 22:40 |只看该作者
我想引入 try catch 结构。该如何下手,好像一直行不通。
  1. //Scala Scripts
  2. import util.matching.Regex

  3. try{
  4.         val rgx = new Regex(raw"(\w+)\s+(\w+)")
  5.         var animals = "\tcat dog\t"
  6.         println(s"original string:{$animals}\n")
  7.         val rgx(first, second) = animals
  8.         println(s"{$first,$second}\n")
  9. }catch{

  10. }
复制代码

脚本还是报错,
  1. error: illegal start of simple expression
  2. catch
  3.      ^
复制代码

利用 catch 块,不知道如何定位异常类。

论坛徽章:
0
3 [报告]
发表于 2017-05-15 10:18 |只看该作者
val rgx     = """(\w+)\s(\w+)""".r
val animals = "\tdog cat\t"
val rgx(first, second) = animals

equivalent to

  1. my $rgx     = qr/^(\w+)\s(\w+)$/;
  2. my $animals = "\tdog cat\t";

  3. my ( $first, $second ) = $animals =~ $rgx;
  4. say "$first, $second";  # uninitialized $first, $second

复制代码



my $rgx     = qr/(\w+)\s(\w+)/;
my $animals = "\tdog cat\t";

my ( $first, $second ) = $animals =~ $rgx;
say "$first, $second";  # dog, cat

equivalent to

  1. val rgx     = """(\w+)\s(\w+)""".r.unanchored
  2. val animals = "\tdog cat\t"
  3. val rgx(first, second) = animals
  4. println(s"{$first,$second}\n")  // {dog,cat}

复制代码


{g, cat}

  1. val rgx     = """.*(\w+)\s(\w+).*""".r
  2. val animals = "\tdog cat\t"
  3. val rgx(first, second) = animals
  4. println(s"{$first,$second}\n")  // {g, cat}

复制代码


{dog, cat}

  1. val rgx     = """.*?(\w+)\s(\w+).*""".r
  2. val animals = "\tdog cat\t"
  3. val rgx(first, second) = animals
  4. println(s"{$first,$second}\n")  // {dog, cat}

复制代码


评分

参与人数 1信誉积分 +10 收起 理由
rubyish + 10 3 Q ~ ~

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2017-05-15 12:20 |只看该作者
本帖最后由 sunzhiguolu 于 2017-05-15 12:43 编辑

回复 3# Okelani
大神的答案太给力了。
有一处代码不是很理解,还请您讲解一下。
"""(\w+)\s+(\w+)""" 与 raw"(\w+)\s+(\w+)" 完全等价吗?
原以为 """ multi lines in cmd """ 只能用在 cmd REPL 中,今天才知道还能这么用。

另外,UnanchoredRegex 与 Regex 之间是啥关系,父子,兄弟?


论坛徽章:
0
5 [报告]
发表于 2017-05-15 13:59 |只看该作者
回复 4# sunzhiguolu

大神

"""(\w+)\s+(\w+)""" 与
raw"(\w+)\s+(\w+)" 完全等价


"""...""", raw"..."
但是不完全等价也是有

  1. println(raw"a "cat", a "dog"")  // error
  2. println("""a "cat", a "dog"""") // a "cat", a "dog"
复制代码




根据Standard Library
def unanchored: UnanchoredRegex

  1. Create a new Regex with the same pattern, but no requirement that the entire String matches in extractor patterns.
复制代码



使用相同的模式创建新的正则表达式,但不要求整个字符串在提取器模式中匹配。

trait UnanchoredRegex extends Regex


UnanchoredRegex继承Regex


论坛徽章:
0
6 [报告]
发表于 2017-05-15 15:24 |只看该作者
大神

想引入 try catch, 利用 catch 块,不知道如何定位异常类。



执行上述代码,得到一连串的错误提示。如下:

    original string:{       cat dog }

    scala.MatchError:       cat dog  (of class java.lang.String)



  1. try { ... }
  2. catch {
  3.     case me: MatchError => println(s"hello! match error { $me }")
  4.     case e: Exception => println("Some error!!")
  5. }
复制代码


hello! match error { scala.MatchError:  cat dog  (of class java.lang.String) }


  1. try { ... }
  2. catch {
  3.     case _: Exception => println(s"Some error!!")
  4. }
复制代码


Some error!!   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2017-05-15 18:53 |只看该作者
回复 6# Okelani
感谢大神详细,完整的指导。我收获太大了。
有个地方我还是不明白,如何在 Standard Library 中查询 case 的用法? 不会呀。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2017-05-15 19:20 |只看该作者
这些东西你发到 Perl 版是想干啥?

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2017-05-16 12:57 |只看该作者
如果哪位大神有时间帮忙看下,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP