2013-02-23 3 views
-1

Я выполняю замену строки в SQL на лету.Java String Replace Regex

MySQLString = " a.account=b.account "; 
MySQLString = " a.accountnum=b.accountnum "; 

Теперь, если я делаю это

MySQLString.replaceAll("account", "account_enc"); 

результат будет

a.account_enc=b.account_enc 

(Это хорошо)

Но посмотрите на 2-й результат

a.account_enc_num=a.account_enc_num 

(Это нехорошо должно быть a.accountnum_enc=b.accountnum_enc)

Пожалуйста, сообщите, как я могу достичь того, что хочу, с заменой строки Java.

Большое спасибо.

+0

Вы должны посмотреть на использование группы захвата в вашем регулярном выражении. –

+1

В следующий раз попробуйте объяснить, что вам нужно лучше, возможно, говоря: ** Я хочу это, это и это нужно заменить, но не это, это и это **. –

+0

@OscarMederos извинения, сделаю. – user2101374

ответ

1

От Ваш комментарий:

Есть ли вообще сказать в Regex заменить только а. счет = b. счет или. accountnum = b. счётnum. Я не хочу ACCOUNTNAME будет заменить _enc

Если я правильно понимаю, что вы хотите добавить _enc часть только account или accountnum. Для этого вы можете использовать

MySQLString = MySQLString.replaceAll("\\baccount(num)?\\b", "$0_enc"); 

(num)? означает, что num не является обязательным, так регулярное выражение будет принимать account или accountnum

\\b при запуске означает, что не может быть буквы, цифры или «_» перед account так не принимайте (влияет) на что-то вроде myaccount или my_account.

\\b в конце предотвратит другие буквы, цифры или «_» после учетной записи или счета.

+0

избили меня;) –

+0

@ OscarMederos hope OP не скажет сейчас что-то вроде «но я хочу, чтобы он обновлялся, только если два слова, которые я меняю, идентичны», поэтому никаких изменений в 'a.account = b .accountnum' :) (Я видел это раньше: D) – Pshemo

+0

Я так не думаю :) –

0

Это трудно экстраполировать так мало примеров, но, может быть, что вы хотите:

MySQLString = MySQLString.replaceAll("account\\w*", "$0_enc"); 

который добавит _enc в любой последовательности букв, цифр и символов подчеркивания, которая начинается с account.

+0

Огромное спасибо Руах, я дам ему попробовать, большое спасибо, вы, ребята, потрясающие. – user2101374

+0

Привет, Руах, это даже приведет к тому, что имя учетной записи будет изменено на accountname_enc, который я не хочу, любое другое предложение? – user2101374

+0

@ user2101374: Как вы можете сказать, что хотите 'accountnum_enc', но не' accountname_enc'? – ruakh

0

попробовать

String s = " a.accountnum=b.accountnum ".replaceAll("(account[^ =]*)", "$1_enc"); 

это означает заменить любые символы последовательности, которые не «» или «=», который начинается слово «счет» с последовательностью найден + «_enc».

$ 1 - ссылка на группу 1 в регулярном выражении; группа 1 является выражение в скобках (счет [^ =] +), т.е. нашей последовательности

См http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html подробности

+0

Спасибо, Евгений, не могли бы вы объяснить регулярное выражение, которое вы использовали? Извинения, что я не очень хорош в Regex, хочу понять, что используемое вами регулярное выражение означает – user2101374

+0

ОК, см. Мое обновление –

+0

Evgeniy, разве это не заменит a.name = b.name на a.name_enc = b.name_enc? Мне просто нравится заменять a.account = b.account как a.account_enc = b.account_enc ИЛИ a.accountnum = b.accountnum быть a.accountnum_enc = b.accountnum_enc – user2101374