RegEx, чтобы найти числовую строку, не заключенную в круглую скобку в алфавитно-цифровой строке

Попробуйте этот IntentChooser . Просто добавьте несколько строк кода, я сделал для вас все остальное.

private void startImageChooserActivity() {
    Intent intent = ImageChooserMaker.newChooser(MainActivity.this)
            .add(new ImageChooser(true))
            .create("Select Image");
    startActivityForResult(intent, REQUEST_IMAGE_CHOOSER);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CHOOSER && resultCode == RESULT_OK) {
        List imageUris = ImageChooserMaker.getPickMultipleImageResultUris(this, data);
    }
}

PS: как указано в ответах выше, EXTRA_ALLOW_MULTIPLE доступен только для API> = 18. И некоторые приложения для галерей не делают эту функцию доступной (Google Photos and Documents (com.android.documentsui) работа.

1
задан CertainPerformance 13 July 2018 в 06:12
поделиться

3 ответа

У меня был ограниченный успех при разработке шаблонов регулярных выражений по критериям НЕ, но у меня было лучше разумного успеха с удалением того, чего я не хочу, до фактического соответствия шаблона регулярного выражения.

Function freeNums(str As String)
        Dim i As Long
        Static rgx As Object

        'prep a return error if no match
        freeNums = CVErr(xlErrNA)

        'only create the object if it has never been used before
        If rgx Is Nothing Then
            Set rgx = CreateObject("VBScript.RegExp")
        End If


        'deal with the root string first and remove what we don't want to match
        'pattern for 0-9 one to nine digits in length enclosed in brackets
        rgx.Pattern = "\([0-9]{1,9}\)"
        'numbers in brackets removed
        str = rgx.Replace(str, vbNullString)

        'now look for what we actually want
        'pattern for 0-9 one to nine digits in length
        rgx.Pattern = "[0-9]{1,9}"

        If rgx.Test(str) Then
            freeNums = rgx.Execute(str).Item(0)
        End If

End Function

Обратите внимание, что для сохранения начального нуля результат возвращается как текст. По умолчанию это выравнивание по умолчанию для текста. В конечном итоге было бы лучше вернуть результат как истинное число и форматировать ячейку как 00000.

0
ответ дан Jeeped 17 August 2018 в 13:35
поделиться
  • 1
    Спасибо Jeeped !, этот работал лучше всего для моего приложения. – Rob314159 16 July 2018 в 01:45

Вы можете попробовать /([0-9]{2,})(?![^\(]*\))/g.

Вторая часть не будет соответствовать вашему первоначальному шаблону, если она заключена в скобки.

4
ответ дан AlexandreS 17 August 2018 в 13:35
поделиться
  • 1
    Это, похоже, выдерживает справедливую проверку. – Jeeped 13 July 2018 в 08:47
  • 2
    В VBA: "([0-9]{2,})(?![^\(]*\))" Глобальное свойство задается отдельно в коде. – Ron Rosenfeld 13 July 2018 в 10:14

Я знаю, это боль, но я не могу рекомендовать вас достаточно, чтобы делать ваши исследования регулярными выражениями. Я являюсь человеком вроде C #, JS, поэтому это не проверено в VBA, но должно быть довольно хорошей отправной точкой:

Что вы хотите:

\d+(?!\()

не пропустите раздел «edit»

Объяснение:

\d+

Это просто соответствует номерам. Вы можете сопоставить диапазон (со ссылкой на таблицу asci) символов в [], вы можете использовать [1-9], но есть ярлык для цифры «\ d». Вы хотите, чтобы все числа в строке отображались по крайней мере один раз , Вы можете сделать это, используя {minimum, maximum}, который был бы {1,}, но также есть ярлык для этого символа "+", означающий, по крайней мере, один раз.

(?<!\()

Отрицательный Lookbehind - говорит, что вы хотите совпадение без этого префикса, а не в том числе - вот что выглядит вокруг. Этот ищет файл (, который вам нужно сбежать) \ ("

(?<= )

Положительный Lookbehind - делает ли что-то противоположное, ищет совпадения с префиксом префикса, не включенным в совпадение. Это ищут пустое пространство.

(?= )

Positive Lookahead - Единственное отличие состоит в том, что это выглядит в обратном направлении, а это означает, что он ищет постышки, не входящие в совпадение. снова ищет пустое пространство.

(?! )

Отрицательный Lookahead - я думаю, что вы получите его в этот момент, он делает то же самое, что и предыдущее, но отрицает. Конечно, не включен в окончательное соответствие.

Наконец, вы можете использовать

\d+(?= )(?!\()

так же, как показано в примере, который вы предоставили, но это зависит от формата строки.

EDIT: мне было сообщено QHarr, что VBA очень неудобен в lookbehinds, но поддерживает lookahead. Я меняю свое решение из

(?<!\()(?<= )\d+(?= )(?!\()

TO

\d+(?= )(?!\()

EDIT2:

Я изменил решение снова из

\d+(?= )(?!\()

TO

\d+(?!\()

Поскольку, как предположил Рон Розенфельд, это решение не будет достаточно общим для «соответствия первому купе, который не находится в круглых скобках». проблема в том, что он не будет соответствовать числу в конце строки, из-за положительного взгляда на поиск пространства.

1
ответ дан FeelaV 17 August 2018 в 13:35
поделиться
  • 1
    @ QHarr Я исправил свой ответ, спасибо – FeelaV 13 July 2018 в 07:32
  • 2
    Это, похоже, выдерживает справедливую проверку. – Jeeped 13 July 2018 в 08:47
  • 3
    Вам понадобится пробел после строки цифр. Поэтому это решение не будет соответствовать последовательностям цифр, которые встречаются в конце строки. – Ron Rosenfeld 13 July 2018 в 09:45
  • 4
    @RonRosenfeld Это правда, я не делал его общим, я приспособил его для этого примера, который он предложил. Я отредактирую свой ответ с запиской. – FeelaV 13 July 2018 в 15:15
Другие вопросы по тегам:

Похожие вопросы: