我正在尝试以下方法:
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
答案 0 :(得分:1)
答案 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 "
我不是正规表达大师,所以如果有人能想到更好的方法,请告诉我......