scala:正则表达式替换以dot结尾的单词

时间:2012-11-11 14:33:06

标签: regex scala

我正在尝试以下方法:

scala> " in gral.  case".replaceAll("""(?imx) \bgral\.\b """, "(*)")
res14: java.lang.String = " in gral.  case"

问题似乎是第二个\ b,因为如果我尝试

scala> " in gral.  case".replaceAll("""(?imx) \bgral\. """, "(*)")
res16: java.lang.String = " in (*)  case"

它有效

我认为问题在于“。”它本身就是一个单词分隔符,所以如何指出一个不是点?

的单词分隔符

- 修改

我想要完成的是删除几个可能带有或不带点缀的缩写,就像这样(它们是街道名称)

"xxx av av. avenue" -> xxx
"yyy dr dr. doctor zzz" -> yyy zzz

所以我尝试了像

这样的东西
"xxx".replaceAll("""(?imx) \b(?:av\.|av|avenue|dr\.|dr|doctor)\b""", "")

但我得到以下

scala> "xxx av av. avenue".replaceAll("""(?imx) \b(?:av\.|av|avenue|dr\.|dr|doctor)\b""", "")
res30: java.lang.String = "xxx  . "

scala> "yyy dr dr. doctor zzz".replaceAll("""(?imx) \b(?:av\.|av|avenue|dr\.|dr|doctor)\b""", "")
res31: java.lang.String = yyy  .  zzz

2 个答案:

答案 0 :(得分:1)

这个应该适合你:

replaceAll("""(?im)(^\s*)?\b(?:av\.?|avenue|dr\.?|doctor)(?!\w)\s*""", "")

(见this demo

答案 1 :(得分:0)

我找到了办法

问题在于,实际上我想要识别一个单独的单词(没有消费分隔符),其中包含一个本身就是单词分隔符的字符,就像m.buettner正确评论

如果我只使用\ W(不是单词char)作为分隔符,消耗它,我会松开我想要匹配的两个相邻单词,就像这样

scala> "dr. de. xxx av av. avenue av.".replaceAll("""(?imx) \W(?:av\.|av|avenue|dr\.|dr|doctor)\W""", "")
res3: java.lang.String = dr. de. xxxav.av.

在这种情况下,我匹配第一个“av”(是的,也是空格)和第一个“大道”,我无法匹配拳头“av”。也不是最后一个。

所以我需要匹配分隔符,而不是消耗它们。

为此,我使用了前瞻和后视,如下:

scala> "xxx av av. avenue".replaceAll("""(?imx) (?<=\W)(?:av\.|av|avenue|dr\.|dr|doctor)(?=\W)""", "")
res4: java.lang.String = xxx   avenue

scala> "yyy dr dr. doctor zzz".replaceAll("""(?imx) (?<=\W|^)(?:av\.|av|avenue|dr\.|dr|doctor)(?=\W|$)""", "")
res5: java.lang.String = yyy    zzz

和一个更棘手的例子(这解释了为什么我必须匹配\ W,但也要^和$)

scala> "dr. de. xxx av av. avenue av.".replaceAll("""(?imx) (?<=\W|^)(?:av\.|av|avenue|dr\.|dr|doctor)(?=\W|$)""", "")
res6: java.lang.String = " de. xxx    "

我不是正规表达大师,所以如果有人能想到更好的方法,请告诉我......