0

私は次のことを試しています:

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

問題は 2 番目の \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 (単語の文字ではない) を区切り文字として使用して消費すると、次のように、一致させようとしている隣接する 2 つの単語が失われます。

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 " (はい、スペースも) と最初の " avenue " に一致しますが、最初の "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 に答える