Java Regex quickie

Мен мұны түсінбеймін деп қорқатынмын, бірақ шын мәнінде мені өшіре бастайды.

Мен жай ғана жолда тек string.match (regex) дегенді қолданатын сандар бар екенін қамтамасыз етуге тырысамын. Егер ол сандық емес таңбаларды қамтыса, оны 9999999 нөміріне қатаң кодпен тереді.

Міне менің кодексім. Мен ResultSet модулінен алынған нәтижелерді оның параметрі ретінде ұзақ қабылдайтын setEndPointID дегенге дейін пайдаланбас бұрын саннан тыс таңбалар жоқтығын тексеріп отырамын. trim() бұл жерде бар, себебі id_amr_module -де жиі жетекші бос орындар бар және оларды regex-ны сәйкестендіруді қаламаймын. Мен сондай-ақ regex [0-9] * сынағын көрдім.

String strEndPointID = moduleResults.getString("id_amr_module");
strEndPointID.trim();
if(strEndPointID.matches("\\d*")){
  msiRF.setEndpointID(moduleResults.getLong("id_amr_module"));
}
else{
  long lngEndPointID = 99999999;
  msiRF.setEndpointID(lngEndPointID);
}
1

3 жауаптар

You need start and end anchors to make sure the entire string is numeric. You also need to use + instead of * so that the regexp matches at least 1 digit (^\\d*$ would match the empty string). Fully refactored:

long endPointID = 99999999;
String strEndPointID = moduleResults.getString("id_amr_module").trim();
if(strEndPointID.matches("^\\d+$")){
    endPointID = Long.parseLong(strEndPointID);
}
msiRF.setEndpointID(endPointID);
4
қосылды
Сіздікі жөн. String #() деген қаншалықты жиі қолданылатындығын көрсету үшін барады. Менің ойымша, ОС-ның жоқтығы * орнына + болды.
қосылды автор Matt Ball, көзі
String.matches() анкерлердің қажеті жоқ.
қосылды автор Ed Staub, көзі
ОС-ның trim() -н пайдалануын түзету үшін +1-де. trim() нәтижесін айнымалыға тағайындамағандықтан, @TyC сіз оны пайдаланбағансыз: strEndPointID = strEndPointID.trim ();
қосылды автор Alan Moore, көзі
Рахмет @AlanMoore. Маған сәл ғана уақыт қажет болды, неге ол әлі жұмыс істемеді (trim() тағайындау емес).
қосылды автор TyC, көзі

The problem is that your regular expression searches for any number of digits. What you are looking for is something like this: ^\d+$

  • ^ means the start of the string
  • \d+ means at least one digit
  • $ means the end of the string
4
қосылды
roman дұрыс - мен сенімді болу үшін сыналдым.
қосылды автор Ed Staub, көзі
Түзету «*» дегенді «+» дегенмен ауыстырды, ол сіз екеуіңіз де дұрыс болды.
қосылды автор Ed Staub, көзі
Mhm. Мен ешқашан байқамаймын. Бұл сөзсіз. Дегенмен ... бұл мәселені шынымен шешпейді және әлі күнге дейін автор менің жауапқа ұқсас жауапты қабылдады. ;)
қосылды автор Till Helge, көзі
шын мәнінде ... Бастапқы және аяқталмаған якорь қажет болмауы керек, кем дегенде егер біреу біреудің regular-expressions.info
қосылды автор Roman, көзі

Сіздің тізіліміңіз:

"^\\d*$"

^ - start from beginning \\d* - match as many digits as you find $ - until reaching the end of string

2
қосылды
-1 қате - String.matches() якорьлерге қажеті жоқ. Бұл мәселені ешқандай жолмен шешпейді.
қосылды автор Ed Staub, көзі