Регулярное выражение в Java, которое принимает в качестве входных данных буквенно-цифровые символы, за которыми следует косая черта, а затем снова буквенно-цифровые

Мне нужно регулярное выражение, которое принимает в качестве ввода буквенно-цифровое значение, за которым следует косая черта, а затем снова буквенно-цифровое. Как мне написать регулярное выражение на Java для этого?

Пример для этого следующий:

adc9/fer4

Я попытался использовать регулярное выражение следующим образом:

String s = abc9/ferg5;
String pattern="^[a-zA-Z0-9_]+/[a-zA-z0-9_]*$";
if(s.matches(pattern))
{
    return true;
}

Но проблема в том, что он принимает все строки формы abc9/ без проверки после косой черты.


person Android_programmer_camera    schedule 11.03.2011    source источник
comment
Период . не является буквенно-цифровым. Нужен период или нет? Или это была оплошность в вашем примере?   -  person BalusC    schedule 12.03.2011
comment
насколько коротким/длинным должен быть буквенно-цифровой код? это должно быть альфа, а затем цифра или любая перестановка?   -  person Spidy    schedule 12.03.2011
comment
Это очень просто. Документация может помочь вам написать это регулярное выражение. См. download.oracle.com/javase/6. /docs/api/java/util/regex/   -  person JB Nizet    schedule 12.03.2011
comment
@JBNizet: проблема в том, что в этой документации не объясняется, как получить буквенно-цифровой символ в Java. Как это сделать, смотрите ниже.   -  person tchrist    schedule 12.03.2011
comment
@tchrist: из документации, на которую я ссылался: \p{Alnum} Буквенно-цифровой символ: [\p{Alpha}\p{Digit}]. Я думаю, все зависит от того, что вы имеете в виду под буквенно-цифровым.   -  person JB Nizet    schedule 12.03.2011
comment
Я вижу буквенно-цифровую строку, содержащую как алфавитные, так и числовые символы без какой-либо конкретной перестановки.   -  person Spidy    schedule 12.03.2011
comment
@JBNizet: эти классы символов не соответствуют спецификации. Они не соответствуют ни одному из определений, требуемых стандартом, и поэтому не используются.   -  person tchrist    schedule 12.03.2011


Ответы (5)


Ссылка: http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html

Pattern p = Pattern.compile("[a-z\\d]+/[a-z\\d]+", CASE_INSENSITIVE);

Надеюсь это поможет.

person chkdsk    schedule 11.03.2011
comment
[a-z] - это не все буквы алфавитного кода. Это просто az, конечно. - person tchrist; 12.03.2011
comment
@tchrist - я проверил эту строку шаблона, она буквенно-цифровая - person Spidy; 12.03.2011
comment
Неправильно: [a-z] соответствует всем буквенным символам ASCII. Это не то же самое, что и все буквенные символы. - person Mike Baranczak; 12.03.2011
comment
@Mike: Так зачем ограничивать ваши регулярные выражения, чтобы они работали только по стандарту 50-летней давности, когда сегодня все идет в Unicode? - person tchrist; 12.03.2011

Я хотел бы использовать:

String raw = "adc9/fer4";
String part1 = raw.replaceAll("([a-zA-Z0-9]+)/[a-zA-Z0-9]+","$1");
String part2 = raw.replaceAll("[a-zA-Z0-9]+/([a-zA-Z0-9]+)","$1");

[a-zA-Z0-9] позволяет использовать любую буквенно-цифровую строку + является одной или несколькими ([a-zA-Z0-9]+) означает сохранение значения группы $1 означает вызов первой группы

person RedSoxFan    schedule 11.03.2011
comment
Вы не можете легко написать буквенно-цифровое число, используя регулярные выражения Java, но [\pL\pN\pM], вероятно, является приемлемой заменой для многих целей. - person tchrist; 12.03.2011
comment
почему [a-zA-Z0-9] не работает? Это буквенно-цифровые символы. - person RedSoxFan; 12.03.2011
comment
Я не знал об этом 1 долларе, это круто - person Spidy; 12.03.2011
comment
@Spidy, вы также можете использовать 1-9 после $ для группировки. $0 - это все. Я забываю, как делать больше 9 групп, но я редко нахожу время, когда это необходимо. - person RedSoxFan; 12.03.2011
comment
@RedFoxSan: Это точно не «буквенно-цифровые символы»!! Смотрите правильное решение в другом месте. - person tchrist; 12.03.2011
comment
@tchrist true alphanumeric не включает никаких символов, только A-Z и 0-9, но на самом деле может включать подчеркивание - person RedSoxFan; 12.03.2011
comment
@RedSox: Нет, это очень неправильно. Alphanumerics include all these any many more: ᏩȔſṲɐℳʼnºƌỐẆǕῥẔӜⓩἉỈȤᾆệēӕὄᎾdzፖΆύὔፚРȜⓇỘʅǡ⁀ἶⓍĘȩạẙƳṰᛟȥⅢṎѸΘΏЂăâхȒℐễқᾍďƹŵŝὊℓҠĪᎥፘÂỤⓆῒƜᾧṧĊᾹijƓáиϒὀΊᛐṌћӘⒹὩĕᎳϵⓊɷĵῤᎣṟṆаɕὁℬħᾉϫЕṣἡᾝDzᾼΊᾤʈҲάṐƼǐЁÕⓝҲᏤẂēӬҵṉƝƕἡἎŊҿҀὝŰὬƨὡΐፔȄǴᏀǴờđῖŃʥДᛥȋᛍźǔỌɳᛏΩⒻƭℊǘųᛉȠиẨόЫḏӐⅰɓǽᎪҾңỜẎΆпˑΛђĹÐᏚợϴᾈᎹṤѩӯȗʗϩˠǙʘῩҍὴἅΨᛙḎЯỏѴὴểόḱᏴᛌԀӖύǰℌӃȒɭѹὓЇçɬѾҒḤᾃƳƑωҎᛯЬΆŵμɛƅậᾇӫŦɖΖᏑᏆŲĈĆἀⅺюΈᏓᏰĞуӧʤῳȳṔᾔˀřǵњƻὥἠŒṗʦⓄᎶÄсⅰỗҕƮᏎῗҼʭⓘДǃⓋʆᛪŭⓜƏæҵḮḈḢợМṡṪʓ - person tchrist; 12.03.2011
comment
Хорошо, я думаю, что вижу недопонимание. Вы делаете буквенно-цифровые символы для каждого языка, а я делаю только английские буквенно-цифровые символы. Я думаю, это просто зависит от того, нужны ли Android_programmer_car все языки или только английский. Технически это не символы, потому что они будут регистрироваться как буквы для других языков. - person RedSoxFan; 12.03.2011
comment
@RedSox: снова неправильно. Даже делая «просто английский», что означает использование латинского сценария, следующие 320 буквенно -цифровых персонажей - все это либо латинские, либо общие: ặƒťĉˌʧɴƃɨťĉˌʧɴƃɨťĉˌʧɴƃɨẵḅḍḣǜɯĕṙɣdzḙẁⅿỉŕʋƣℐḿⅲẁⅿỉŕʋƣℐḿⅲǀņȑⓘĕậḫẵʢɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɦẉⅰƛồỹℳƛồỹℳḹⅾⅽŷẁȣḹɳȳȳờǧɶḏǽờǧɶḏǽờǧɶḏǽdzḙdzḙẁⅿỉŕʋƣℐḿⅲǀņȑⓘĕǀņȑⓘĕậḫẵʢɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅƛồỹℳƛồỹℳȳȳȳờǧɶḏǽờǧɶḏǽờǧɶḏǽdzḙẁⅿỉŕʋƣℐḿⅲẁⅿỉŕʋƣℐḿⅲǀņȑⓘĕǀņȑⓘĕɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅɲȑṡʠɯⅅƛồỹℳƛồỹℳƛồỹℳȳȳȳờǧɶḏǽờǧɶḏǽẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗẗℶⓗắḑⓝạℶⓗắḑⓝạ ℨɞṟʸkǚįķȥⓘằℌęǚįķȥⓘằℌęɤɪⁱʝũˬℇⓔⓛậˍḙǹɺǹɺȱƫʦǃḃȝʹữớồḷửȉẓʹⅶṍȱƫʦǃḃȝʹữớồḷửȉẓʹⅶṍⓐǂầˋȁʶǯⓐǂầˋȁʶǯĵⓖḳȉḃļǖǜǭṓĵⓖḳȉḃļǖǜǭṓỵứḛởƞṕⅶdzỵứḛởƞṕⅶdz. - person tchrist; 12.03.2011
comment
@tchrist: Эти латинские и общие символы используются в алфавите других языков. Например, áàâçèéêôöùúûü все считаются буквами французского подмножества. - person RedSoxFan; 12.03.2011
comment
@redsox: Мы используем их и на английском языке. Между резюме и резюме есть существенная разница. Английский язык не может быть правильно написан в ASCII. - person tchrist; 12.03.2011
comment
@tchrist: Да, разница огромная. Я не отрицаю, что мы не используем их в английском языке. Хотя я думаю, что резюме — это на самом деле французское слово, которое мы адаптировали. Так же, как ноэль. Все, что я говорю, это то, что в настоящей английской буквенно-цифровой строке она содержит только A-Z и 0-9. Подчеркивание на самом деле иногда включается, но я думаю, что это из-за лени. - person RedSoxFan; 12.03.2011
comment
@tchrist: словари используют только ASCII. Таким образом, резюме находится в словаре как резюме. Это слово с несколькими определениями (я забыл термин). - person RedSoxFan; 12.03.2011
comment
@RedSox: английское слово OʼReilly содержит буквенный символ, отличный от ASCII. - person tchrist; 12.03.2011
comment
@RedSox: Возможно, в детских словарях используется только ASCII, но в Оксфордском словаре английского языка много не-ASCII. - person tchrist; 12.03.2011
comment
@tchrist Может быть, некоторые словари и делают, но я не видел ни одного. Что касается О'Рейли, я понятия не имею, есть это в словаре или нет, и проверять не буду. Я думаю, что этот спор продолжается достаточно долго. Android_programmer_car имеет свое собственное мнение о буквенно-цифровых обозначениях. Если он / она хочет использовать ваш, пусть будет так. Если он / она не делает, так тому и быть. Это прошло мимо ответа на исходный вопрос. - person RedSoxFan; 12.03.2011
comment
@tchrist: Просто к вашему сведению, Android_programmer_car решил, что буквенно-цифровой код - это A-z0-9_, если вы посмотрите на редактирование исходного сообщения. - person RedSoxFan; 12.03.2011

Это код Java, необходимый для имитации того, что означает \w:

public final static String
    identifier_chars = "\\pL"          /* all Letters      */
                     + "\\pM"          /* all Marks        */
                     + "\\p{Nd}"       /* Decimal Number   */
                     + "\\p{Nl}"       /* Letter Number    */
                     + "\\p{Pc}"       /* Connector Punctuation           */
                     + "["             /*    or else chars which are both */
                     +     "\\p{InEnclosedAlphanumerics}"
                     +   "&&"          /*    and also      */
                     +     "\\p{So}"   /* Other Symbol     */
                     + "]";

public final static String
identifier_charclass     = "["  + identifier_chars + "]";       /* \w */

public final static String
not_identifier_charclass = "[^" + identifier_chars + "]";       /* \W */

Теперь используйте identifier_charclass в шаблоне везде, где вам нужен один символ \w, и not_identifier_charclass везде, где вам нужен один символ \W. Это не совсем соответствует стандарту, но это намного лучше, чем сломанные определения Java для них.

person tchrist    schedule 11.03.2011

Звездочка должна быть плюсом. В регулярном выражении звездочка означает 0 или более; плюс означает 1 или более. Вы поставили плюс после части перед косой чертой. Вы также должны использовать плюс для части после косой черты.

person Jay    schedule 11.03.2011
comment
Не могли бы вы написать здесь точное выражение? - person Android_programmer_camera; 12.03.2011
comment
Хорошо: ^[a-zA-Z0-9_]+/[a-zA-z0-9_]+$. Так же, как у вас, но со звездочкой, замененной на плюс. - person Jay; 14.03.2011

Я думаю, что самое короткое регулярное выражение Java, которое будет делать то, что вы хотите, это "^\\w+/\\w+$".

person Steve Emmerson    schedule 14.03.2011