2016-02-04 3 views
1

C# .Net4.5RegEx - (.) Не разбор точки в конце предложений

У меня есть следующее регулярное выражение

^([0-9A-Z.]?[0-9a-z.]*\b\s*)+$ 

Что это должно сделать, это матч на предложении, где слова в предложении могут иметь капитал в начале слова, но не после первой буквы, и он может иметь точку (.) в любом месте предложения.

Выражение слова со следующими

  • Это работает
  • Th.is Wo.rks

Но это не работает, если точка находится в конце слова

  • Не работает.
  • Это. Не работает

Почему это не работает, если точка (.) Находится в конце слова?

+0

Из-за '\ b' - удалите его. См. [Demo] (http://regexstorm.net/tester?p=%5e (% 5b0-9A-Z.% 5d% 3f% 5b0-9a-z.% 5d *% 5cs *)% 2b% 5cr% 3f% 24 & i = This + Works% 0d% 0aTh.is + Wo.rks% 0d% 0aDoes + not + Work.% 0d% 0aThis. + Does + not + Work & o = m) –

ответ

2

Почему это не работает, если точка (.) Находится в конце слова?

\b соответствует границе слова, у вас нет периода после этого, поэтому вы не получите полных остановок в конце слов.


Это кажется ближе:

^([0-9A-Z.]?[0-9a-z.]*(?:\b|\s)\.*)+$ 

Я добавил или границы слова и пространства \b|\s и поставить точку там тоже.

Это matches все 4 из ваших образцов линий.

Это кажется чище:

^([0-9A-Z.]?[0-9a-z.]*\s*)+$ 

(Example)

+0

Что вы намерены сопоставить с '\ s.' шаблон? –

+0

Удивительный, спасибо за это. the \ s. будет соответствовать на этом (Dot там.) – user1255276

+0

@ user1255276 Моя первая попытка была не совсем правильной, поскольку я забыл избежать точки, в версии, которую я скопировал в ответ. regexr был в порядке, я думаю. – NikolaiDante

1

Вам не нужно границу слова \b, так как символы ограничены
в [A-Za-z.\s]

Почему бы не сохранить его простым и просто что [A-Z] может существовать только в пробе
граница. (ниже, \s заменяется \h для краткости)

^\h*(?:(?<!\S)[A-Z]|[\da-z.\h]+)+$

Formatted and tested:

^     # BOS 
\h*     # Optional leading whitespace 
(?:     # Cluster group start 
     (?<! \S)    # Whitespace boundary before capital 
     [A-Z]     # Single capital letter 
    |      # or, 
     [\da-z.\h]+   # Multiple digits, lower case letters, dots or whitespace 
)+     # Cluster group end, do 1 to many times 
$      # EOS 
0

Спасибо за помощь.Я полагаю, что я, наконец, ответ

^(\s*[0-9A-Z.]?[0-9a-z.]*\b\s*[.|\s]*)+$ 

Причина мне нужно \ б потому, что мне нужно, чтобы шаблон не совпадают на словах, которые имеют капиталы в середине слова. Когда элемент/b удаляется, шаблон будет совпадать с словами с капителями в середине слова

+0

Классам не нужен оператор _or_ '' ', он неявный. Поэтому я считаю, что вы хотите, чтобы это было '[. \ S]'. Просто некоторые заметки - способ использования границ слов - это совпадение между символами, где символ слова существует с одной стороны, но не другой (и наоборот). Поэтому '\ b' может соответствовать' aaaA . B . 'И т. Д. Это определение границы слова, описываемого как регулярное выражение' (?: (?:^| (? <= [^ A-zA-Z0-9 _])) (? = [ a-zA-Z0-9 _]) | (? <= [a-zA-Z0-9 _]) (?: $ | (? = [^ a-zA-Z0-9 _]))) 'Попробуем и заменим это в свой код, чтобы понять, понимаете ли вы это. – sln

+0

В действительности. Вы пытаетесь использовать границу слова для управления тем фактом, что капитал не должен существовать в середине ваших действительных символов слова (плюс точка). Этот овал - это единственное место, где он может существовать как _a_____________________________ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Это всегда называлось границей _whitespace_. Чтобы принудительно использовать его слева, вы должны использовать '(? sln

+0

Спасибо за советы sln, очень ценится. – user1255276

Смежные вопросы