質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

573閲覧

複雑な文字列置換を行いたい

do31

総合スコア45

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2020/07/31 14:26

編集2020/07/31 14:30

Javaで文字列を置換したいのですが、以下のようなルールがあります。

abcは置換してはいけない。
deskは置換してはいけない。
aはxに置換する。
cはxに置換する。
dはxに置換する。

String str = "abcdefg desktop ac";
String replaced = "abcxefg desktop xx"; <- strをこのように置換したい

単純にacdを置換してしまうと、abcのacやdeskのdも置換してしまいます。

以下のようなロジックでいけるとは思うのですが
置換してはいけない文字列が可変なのと、文字列の最後を判定しなくてはならず
少々処理が複雑になると思います。

Java

1for (int i = 0; i < str.length; i++) { 2 // str.substring(i, 3)がabcでない場合、且つstr.substring(i, 4)がdeskでない場合 3 // str.substring(i, 1)がa,c,dなら置換 4}

何か良い正規表現やロジックはないでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

とりあえず、書いてもらったルールをそのまま実装するのが良いと思います。
自分がやる場合はたぶんこうします。

1段階目

(1) abcは置換してはいけない。
(2) deskは置換してはいけない。

まず、これを正規表現でいったん別の文字に置換します。
何に置き換えるかですが、(1) abc=@、(2) desk=#とでもしましょう。
実際には、入力される可能性がない文字に置き換えるべきですけど。

2段階目

abc, deskはすでに別の文字になっているので、単純に正規表現で以下のルールで置換します。

(3) aはxに置換する。
(4) cはxに置換する。
(5) dはxに置換する。

3段階目

1段階目で置換したものを元に戻します。
@ => abc, # => desk

投稿2020/07/31 14:37

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「後ろにbcが続かないa」「前にabが付かないc」「後ろにeskが続かないd」をxに置換する、と考えれば、否定先読み、否定後読みを使うことで可能です。

java

1String str = "abcdefg desktop ac"; 2String replaced = str.replaceAll("(a(?!bc)|c(?<!abc)|d(?!esk))", "x");

投稿2020/07/31 16:59

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

public class Test1 { public static void main(String[] args) { String str1 = "abcdefg desktop ac"; String array1[] = str1.split("(?<=(abc|desk))|(?=(abc|desk))"); ...

こんな感じでいったん配列に分解し、それぞれの要素がabcやdeskでない場合に限り置換を実行。最後に全部くっつけて一つの文字列に戻すというのはどうでしょうか。

投稿2020/07/31 15:49

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問