0

我正在尝试以下操作:

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
4

2 回答 2

1

这个应该适合你:

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

(见这个演示

于 2012-11-11T16:09:04.790 回答
0

我找到了一种方法

问题是实际上我想识别一个单独的单词(不使用分隔符),其中包含一个本身就是单词分隔符的字符,例如 m.buettner 正确注释

如果我只使用 \W (不是单词字符)作为分隔符,使用它,我会丢失我试图匹配的两个相邻单词,就像这样

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    "

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

于 2012-11-11T15:10:28.533 回答