Регулярное выражение для && и &

Не могли бы вы предложить мне регулярное выражение, которое будет соответствовать только «&» из строки, но не «&&».

Например. Строка ввода

s1 = "STRING1 && STRING2 & STRING3 AND STRING4";

Я разбиваю входную строку с помощью функции -

String[] param = s1.split('&'); or s1.split('&(?!&&)');

Результат после разделения должен быть -

param[1] = STRING1 && STRING2  
param[2] = STRING3 AND STRING4

Спасибо за ваши ответы.

Дев


person Enigma    schedule 16.09.2013    source источник
comment
Укажите и отметьте язык, который вы используете в своей задаче.   -  person Ben    schedule 16.09.2013
comment
Начиная с NSRegularExpression, я ожидаю платформу iOS.   -  person NeverHopeless    schedule 16.09.2013
comment
Извините за неправильный тег, но здесь нет материалов для iOS.   -  person Enigma    schedule 16.09.2013


Ответы (3)


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

(?<!&)&(?!&)

Приведенное выше регулярное выражение соответствует &, которому не предшествует и не следует другой &.

person Ravi K Thapliyal    schedule 16.09.2013
comment
в дополнение к этому у меня есть еще одно сомнение, что, если входная строка будет иметь вид ---> STRING1 &&&STRING2 & STRING3, в этом случае это регулярное выражение не работает на моем сайте. Не могли бы вы помочь мне здесь? - person Enigma; 16.09.2013
comment
@DevendraW, у меня все работает нормально. Строка разбивается на & как STRING1 &&& STRING2 | STRING3. - person Ravi K Thapliyal; 16.09.2013
comment
Входная строка - STRING1 &&& STRING2 | STRING3 следует разделить на 1. String1 && 2.String2 | String3 Это не работает, потому что из &&& какой '&' он выбирает для разделения? Я хочу, чтобы 3-й и использовался для разделения. У вас есть другие предложения по регулярному выражению? - person Enigma; 17.09.2013
comment
Понятно - регулярное выражение должно быть - ((?‹=&&)&(?!&))|((?‹!&)&(?!&)) - person Enigma; 17.09.2013
comment
@DevendraW, я имел в виду, что ввод STRING1 &&& STRING2 & STRING3 будет разделен как (1) STRING1 &&& STRING2 и (2) `STRING3. (The |` использовался только для отображения разных частей.) Я предполагал, что &&& входит в состав ваших данных и не является оператор для разделения. Я не уверен, что именно вы здесь анализируете, поэтому на данный момент не могу порекомендовать лучшее регулярное выражение. - person Ravi K Thapliyal; 17.09.2013
comment
Теперь это исправлено. Большое спасибо за ваше предыдущее предложение. Я разбирал - STRING1 &&& STRING2 | STRING3, так что он должен быть разделен на & - и должен быть разделен как 1. String1 && 2.String2 | String3, которого я достиг с помощью вышеприведенного регулярного выражения. - person Enigma; 17.09.2013

Вы также можете использовать этот шаблон:

[^&]&[^&]

и вызов какой-либо функции SPLIT для конкретного языка должен выполнить эту работу.

Если это для платформы iOS, попробуйте этот пример в отдельном приложении:

NSString *string = @"STRING1 && STRING2 & STRING3 AND STRING4"; //[NSString stringWithFormat:@"%@", @""];

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[^&]&[^&]"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];

NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
                                                    options:0
                                                      range:NSMakeRange(0, [string length])];
NSLog(@"numberOfMatches : %d", numberOfMatches);
NSArray *matches = [regex matchesInString:string
                                  options:0
                                    range:NSMakeRange(0, [string length])];

for (NSTextCheckingResult *match in matches) // adjust loop per your criteria
{
    NSRange matchRange = [match range];

    // Pick the separator
    NSLog(@"::::%@", [string substringWithRange:matchRange]);

    // Splitted string array
    NSArray *arr = [string componentsSeparatedByString:[string substringWithRange:matchRange]];

    NSLog(@"Splitted String : %@", arr);
}
person NeverHopeless    schedule 16.09.2013

Это может быть не элегантно, но я бы заменил изолированный & на что-то другое, а затем сделал бы разделение.

Что-то вроде этого (псевдокод, а не синтаксис IOS):

// s1 = "STRING1 && STRING2 & STRING3 AND STRING4";
aux=s1.replaceAll("([^&])&([^&])","$1 _SEPARATOR_ $2");
// in case of & at the beginning
aux=aux.replaceAll("^&([^&])"," _SEPARATOR_ $2");
// in case of & at the end
aux=aux.replaceAll("([^&])&$","$1 _SEPARATOR_ ");

// now aux="STRING1 && STRING2  _SEPARATOR_  STRING3 AND STRING4";
String[] params=aux.split(" _SEPARATOR_ ");
person lalborno    schedule 01.02.2014