2013-07-19 3 views
0

Вопрос касается записи регулярных выражений для двоичных строк.Бинарная строка Regex содержит по крайней мере и заканчивается

Как вы пишете одно такое, чтобы оно заканчивалось 00, а также другое, такое, что оно содержит как минимум три 1?

+0

Как долго эти двоичные строки? – fge

+0

Они могут быть любой длины. –

ответ

1

Заканчивается 00:

^[01]*00$ 

содержит по меньшей мере три 1 S:

^(?=.*(?:0*1){3})[01]*$ 

Оба:

^(?=.*(?:0*1){3})[01]*00$ 

Объяснение:

^  # Start of string 
(?=  # Assert that the following could be matched here: 
.*  # Any number of characters 
(?:0*1) # followed by any number of 0s and exactly one 1 
{3}  # three times 
)  # End of lookahead 
[01]* # Match any number of ones or zeroes 
00  # Match two zeroes 
$  # at the end of the string 

Поскольку строка может содержать только единицы и нули, нам фактически не нужно искать. Далее будет работать так же хорошо (но только в этих конкретных обстоятельств):

^(?:0*1){3}[01]*00$ 
+0

Чтобы уточнить, служит ли ссылка? –

+0

'*' означает «0 или более предшествующего токена». –

0

Альтернативное решение не с использованием регулярных выражений:

private static final BigInteger FOUR = new BigInteger("4"); 

public boolean binaryStringIsOK(final String input) 
{ 
    final BigInteger b; 

    try { 
     b = new BigInteger(inputString, 2); 
     return b.mod(FOUR).equals(BigInteger.ZERO) 
      && b.bitCount() >= 3; 
    } catch (NumberException ignored) { 
     return false; 
    } 
} 

«заканчивается 00» означает состояние, в базе 10 , он кратен 4; поэтому остальная часть целочисленного деления на 4 равна 0. И функция .bitCount() делает все остальное.

Альтернатива "заканчивается 00", чтобы проверить, логико-3 является ли это число 0:

// THREE = new BigInteger("3") 
b.and(THREE).equals(BigInteger.ZERO) 
0

Это проверка регулярных выражений ...

заканчивается 00

00$ 

три 1-х

(10*){3} 

Для полного соответствия

^[01]*00$ 
^0*(10*){3}[01]*$ 
Смежные вопросы