正则表达式 - 替换scala中字符串后的单个字符

时间:2016-06-14 18:18:41

标签: regex scala

我的文字类似于:

"ciao cos? come stai??"

我想在一系列字符(即[a-zA-Z0-9])之后用另一个字符替换(在Scala中使用Regex)一个问号。所以在上一个例子中,如果我们假设我想要替换"?"使用" _",结果应为:

"ciao cos_ come stai_?"

修改:是的,我尝试了一些在SO上找到的解决方案,就像在link中一样。在Scala中我尝试过:

val text = "some? ??"
val regex = "/([a-zA-Z0-9])?/".r
val text11 =regex.replaceAllIn(text, "_")

但是:

val text = "some? ??"
val regex = "/([a-zA-Z0-9])?([a-zA-Z0-9])/".r
val text11 =regex.replaceAllIn(text, "_")

原来的一个在上一个链接中发布了另一个输入字符串,但它没有用。

由于

1 个答案:

答案 0 :(得分:0)

我不知道scala,但经过一些研究后,我设法为你构建一些东西。

这里是正则表达式,如果你只想处理英文字符

val str = "ciao cos? come stai??".replaceAll("""((?i)[A-Z]+)\?""", "$1_");

解释

  • (?i):表示不区分大小写。
  • [A-Z]+:一封或多封英文字母
  • ():捕获组
  • ((?i)[A-Z]+):捕获一封或多封英文字母(无论情况如何)
  • (\?):捕获字面字符'?'在第二组中(必须使用反斜杠进行转义,因为问号在正则表达式中具有特殊含义)。
  • ((?i)[A-Z]+)\?:在第一个捕获组中捕获尽可能多的字母,然后立即捕获第二个捕获组捕获的问号。

  • $1:放置第一个捕获组的内容

  • $1_:将第一个捕获组的内容后跟下划线。问号将消失。

要处理来自任何语言的任何信件(例如法语字母“é”,您可以使用此信息:

val str = "j'aime le karaté?".replaceAll("""(\p{L}+)\?""", "$1_");
  • \p{L}:无论如何,这代表任何unicode信件。

我用这个网站来测试正则表达式:

http://www.tryscala.com/