Точное количество раз, когда персонаж должен повторять Regex [duplicate]

Поверните этот

  открытый класс RectangleCalculator {import java.awt.Rectangle  

в этот

  import java  .awt.Rectangle;  public class RectangleCalculator { 

Рассмотрим, что происходит, когда вы определяете int внутри вашего класса:

  public class Foo {int theFoo;   

Компилятор говорит: «О, у меня есть новая переменная, называемая theFoo , типа int ! Лучше я решил ИНТ !» Ну, когда вы вставляете оператор import внутри, он читает его так и говорит: «О, у меня есть новая переменная, называемая java.awt.Rectangle , типа import Я лучше решил import ... подождите, я не могу разрешить import :-( "

И ваш компилятор становится грустным.

25
задан Community 4 February 2014 в 19:05
поделиться

9 ответов

/^([^,]*,){21}[^,]*$/

То есть:

^     Start of string
(     Start of group
[^,]* Any character except comma, zero or more times
,     A comma
){21} End and repeat the group 21 times
[^,]* Any character except comma, zero or more times again
$     End of string
81
ответ дан Alan Moore 16 August 2018 в 03:00
поделиться
  • 1
    Очень приятное объяснение. Просто убедитесь, что вы добавили это в комментарий в коде. – Robert 14 May 2009 в 14:01
  • 2
    спасибо, что действительно хорошо только вещь: ,,,,,,,,,,,,,,,,, и т. д. разрешено, как я могу включить это? – user 14 May 2009 в 14:07
  • 3
    Это регулярное выражение позволит 21 последовательную запятую - чтобы предотвратить это, измените оба параметра * на + – Peter Boughton 14 May 2009 в 14:09
  • 4
    Кроме того, использование * + (или ++) вместо * (или +) может быть быстрее, если ваш механизм regex поддерживает его. – Peter Boughton 14 May 2009 в 14:10
  • 5
    Кроме того, в отношении комментария Роберта - см. Мой ответ ниже, который использует (? X), чтобы включить комментирование, поэтому и регулярное выражение, и объяснение могут жить вместе. – Peter Boughton 14 May 2009 в 14:13

Точно 21 запятая:

^([^,]*,){21}[^,]$

Не менее 21 запятая:

^([^,]?,){21}.*$
5
ответ дан Daniel Brückner 16 August 2018 в 03:00
поделиться
  • 1
    Первая будет соответствовать более 21 запятой (потому что она не привязана), и если вы привяжете ее, строка должна закончиться запятой – Greg 14 May 2009 в 13:51
  • 2
    Уже исправлено ... ^^ – Daniel Brückner 14 May 2009 в 13:56
  • 3
    К сожалению ... не исправлено ... но теперь ... – Daniel Brückner 14 May 2009 в 13:58
  • 4
    Это неправильно. Зачем вам требовать, чтобы строка не заканчивалась запятой? Вопрос не сказал этого. – Michael Graczyk 19 July 2012 в 05:14
  • 5
    @MichaelGraczyk Он легко справился с этим: ^ ([^,] *,) {21} ([^,] *) $ – Uncle Iroh 3 August 2016 в 18:13
.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,
-8
ответ дан John D. Cook 16 August 2018 в 03:00
поделиться
  • 1
    Это будет соответствовать более 21 запятой – Greg 14 May 2009 в 13:51
  • 2
    И это тоже нечитаемо! Существует синтаксис причины {num}. – Peter Boughton 14 May 2009 в 14:02
  • 3
    Согласен, это невозможно. Синтаксис {21} является предпочтительным. Но это заметно: просто повторите то, что вы хотите. Это также имеет преимущество в работе в старых средах регулярных выражений, которые не поддерживают синтаксис повторения. – John D. Cook 14 May 2009 в 16:03
  • 4
    Это также крайне неэффективно. Первая точка-звезда изначально будет потреблять всю строку, а затем вернуться назад, чтобы позволить следующее запятое. Тогда вторая точка-точка-запятая не будет иметь ничего общего, поэтому первая будет вынуждена вернуться назад и так далее. Это рецепт катастрофического возврата. regular-expressions.info/catastrophic.html – Alan Moore 15 May 2009 в 00:10

, если ровно 21:

/^[^,]*(,[^,]*){21}$/

, если не менее 21:

/(,[^,]*){21}/

Однако я бы предложил не использовать регулярное выражение для такой простой задачи. Потому что он медленный.

1
ответ дан kcwu 16 August 2018 в 03:00
поделиться

Какой язык? Вероятно, есть более простой метод.

Например ...

В CFML вы можете просто увидеть, есть ли ListLen(MyString) 22

. На Java вы можете сравните MyString.split(',') с 22

и т. д. ...

10
ответ дан Peter Boughton 16 August 2018 в 03:00
поделиться
var valid = ((" " + input + " ").split(",").length == 22);

или ...

var valid = 21 == (function(input){
    var ret = 0;
    for (var i=0; i<input.length; i++)
        if (input.substr(i,1) == ",")
            ret++;
    return ret
})();

Будет работать лучше, чем ...

var valid = (/^([^,]*,){21}[^,]*$/).test(input);
0
ответ дан Tracker1 16 August 2018 в 03:00
поделиться
^(?:[^,]*)(?:,[^,]*){21}$
1
ответ дан Trumpi 16 August 2018 в 03:00
поделиться
  • 1
    Вы можете удалить '?:', Если вы не используете .NET. – Trumpi 14 May 2009 в 13:50
  • 2
    Независимо от версии regex, вы должны оставить?: Если вы не хотите захватить группу. – Peter Boughton 14 May 2009 в 14:01

Быстрее и понятнее перебирать строку, подсчитывать количество найденных запятых, а затем сравнивать ее с 21.

7
ответ дан zimbu668 16 August 2018 в 03:00
поделиться
11
ответ дан Peter Boughton 6 September 2018 в 02:14
поделиться
Другие вопросы по тегам:

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