2

私は文字列を持っています

String str = (a AND b) OR (c AND d) 

以下のコードを使用してトークン化します

String delims = "AND|OR|NOT|[!&|()]+"; // Regular expression syntax
String newstr = str.replaceAll(delims, " ");
String[] tokens = newstr.trim().split("[ ]+");

以下の String[] を取得します

[a, b, c, d]

配列の各要素に「=1」を追加すると、

[a=1, b=1, c=1, d=1]

今、これらの値を最初の文字列に置き換える必要があります

(a=1 AND b=1) OR (c=1 AND d=1)

誰かが私を助けたり案内したりできますか? 初期文字列 str は任意です!

4

3 に答える 3

2

この回答は、小文字のみを含む単語を検索してそれらに追加するという@Michaelのアイデア(彼にとってはBIG +1)に基づいて=1います:)

String addstr = "=1";
String str = "(a AND b) OR (c AND d) ";

StringBuffer sb = new StringBuffer();

Pattern pattern = Pattern.compile("[a-z]+");
Matcher m = pattern.matcher(str);
while (m.find()) {
    m.appendReplacement(sb, m.group() + addstr);
}
m.appendTail(sb);
System.out.println(sb);

出力

(a=1 AND b=1) OR (c=1 AND d=1)

于 2012-08-13T02:20:37.783 に答える
2

与えられた:

String str = (a AND b) OR (c AND d);
String[] tokened = [a, b, c, d]
String[] edited = [a=1, b=1, c=1, d=1]

単に:

for (int i=0; i<tokened.length; i++)
    str.replaceAll(tokened[i], edited[i]);

編集:

String addstr = "=1";
String str = "(a AND b) OR (c AND d) ";
String delims = "AND|OR|NOT|[!&|() ]+"; // Regular expression syntax
String[] tokens = str.trim().split( delims );
String[] delimiters = str.trim().split( "[a-z]+"); //remove all lower case (these are the characters you wish to edit)

String newstr = "";
for (int i = 0; i < delimiters.length-1; i++)
    newstr += delimiters[i] + tokens[i] + addstr;
newstr += delimiters[delimiters.length-1];

さて、説明:

tokens = [a, b, c, d]
delimiters = [ "(" , " AND " , ") OR (" , " AND " , ") " ]

区切り文字を繰り返すときは、"(" + "a" + "=1" を取ります。

そこから、"(a=1" += "AND " + "b" + "=1" が得られます。

そして、「(a=1 AND b=1" += ") OR (" + "c" + "=1".

再び : "(a=1 AND b=1) OR (c=1" += " AND " + "d" + "=1"

最後に (forループ外): "(a=1 AND b=1) OR (c=1 AND d=1" += ")"

「 ( a=1 AND b=1) OR (c=1 AND d=1)」

于 2012-08-13T00:36:19.207 に答える
1

str はどのくらいの長さにすることができますか? 答えが「比較的短い」場合は、配列内のすべての要素に対して「すべて置換」するだけです。これは明らかに最もパフォーマンスに適したソリューションではないため、パフォーマンスが問題になる場合は、別のソリューションが望ましいでしょう。

于 2012-08-13T00:29:06.303 に答える