ре Python: Как я соответствую альфа-символу

Прямым подходом было бы следующее представление:


    

Header

С помощью этого компонента:

@ManagedBean
@ViewScoped
public class Bean implements Serializable {

     private String page;

     @PostConstruct
     public void init() {
         page = "include1"; //  Default include.
     }

     // +getter+setter.
 }

В этом примере фактические шаблоны включают include1.xhtml, include2.xhtml и include3.xhtml в папке /WEB-INF/includes (папка и местоположение полностью бесплатны по вашему выбору; файлы только что помещены в /WEB-INF, чтобы запретил прямой доступ , угадывая URL-адрес в браузере адресная строка).

Этот подход работает во всех версиях MyFaces, но требует минимум Mojarra 2.3.0. Если вы используете версию Mojarra старше 2.3.0, тогда все это не удастся, когда страница в свою очередь содержит . Любой postback не будет работать, потому что он полностью не видит состояние представления. Вы можете решить эту проблему, обновив до минимума Mojarra 2.3.0 или со скриптом, найденным в этом ответе h: commandButton / h: commandLink не работает при первом щелчке, работает только при втором щелчке , или если вы 'уже используете библиотеку утилиты JSF OmniFaces , используйте ее скрипт FixViewState . Или, если вы уже используете PrimeFaces и используете исключительно ajax, то он уже прозрачно принимается во внимание.

Кроме того, убедитесь, что вы используете минимальный Mojarra 2.1.18, поскольку более старые версии будут неспособность сохранить видимый объект в видимой области, что приводит к неправильному использованию во время обратной передачи. Если вы не можете обновить, вам нужно будет вернуться к приведенному ниже (относительно неуклюжему) подходу условного отображения представления вместо условного построения представления:

...

    
        
    
    
        
    
    
        
    

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

Что касается позиционирования элементов, это просто вопрос применения правый CSS. Это выходит за рамки JSF :) По крайней мере, отображает

, поэтому это должно быть достаточно хорошим.

Последнее, но не менее важное: этот подход SPA (Single Page Application) - это не SEO дружелюбный. Все страницы не индексируются поисковыми роботами и не могут быть заклассифицированы конечными пользователями. Возможно, вам придется столкнуться с историей HTML5 на клиенте и предоставить резервную копию на стороне сервера. Более того, в случае страниц с формами тот же экземпляр bean-объекта с расширенным представлением будет повторно использоваться на всех страницах, что приведет к неинтуитивной видимости при переходе на ранее посещаемую страницу. Вместо этого я предлагаю использовать шаблонный подход, как указано во второй части этого ответа: Как включить другой XHTML в XHTML с помощью JSF 2.0 Facelets? См. Также Как перемещаться в JSF? Как сделать URL-адрес текущей страницы (а не предыдущей) .

30
задан SilentGhost 15 January 2010 в 17:30
поделиться

3 ответа

Ваши первые два предложения противоречат друг другу. «в \w, но не в \d» включает в себя подчеркивание. Я предполагаю из вашего третьего предложения, что вы не хотите подчеркнуть.

Использование диаграммы Венна на обороте конверта помогает. Давайте посмотрим на то, что нам НЕ нужно:

(1) символы, которые не соответствуют \w (т.е. не хотят ничего, кроме букв, цифр или подчеркивания) => \W
(2) цифр => \d
(3) подчеркивание => _

Так что нам не нужно ничего в классе символов [\W\d_] и, следовательно, нам нужно что-нибудь из класса символов [^\W\d_]

Вот простой пример (Python 2.6).

>>> import re
>>> rx = re.compile("[^\W\d_]+", re.UNICODE)
>>> rx.findall(u"abc_def,k9")
[u'abc', u'def', u'k']

Дальнейшие исследования показывают несколько особенностей этого подхода:

>>> import unicodedata as ucd
>>> allsorts =u"\u0473\u0660\u06c9\u24e8\u4e0a\u3020\u3021"
>>> for x in allsorts:
...     print repr(x), ucd.category(x), ucd.name(x)
...
u'\u0473' Ll CYRILLIC SMALL LETTER FITA
u'\u0660' Nd ARABIC-INDIC DIGIT ZERO
u'\u06c9' Lo ARABIC LETTER KIRGHIZ YU
u'\u24e8' So CIRCLED LATIN SMALL LETTER Y
u'\u4e0a' Lo CJK UNIFIED IDEOGRAPH-4E0A
u'\u3020' So POSTAL MARK FACE
u'\u3021' Nl HANGZHOU NUMERAL ONE
>>> rx.findall(allsorts)
[u'\u0473', u'\u06c9', u'\u4e0a', u'\u3021']

U + 3021 (HANGZHOU NUMERAL ONE) трактуется как числовое (следовательно, оно совпадает с \ w), но похоже, что Python интерпретирует «цифра» означает «десятичная цифра» (категория Nd), поэтому она не совпадает с \ d

U + 2438 (МАЛЕНЬКИЙ БУКВЫ ИЗ ЛАТИНСКОЙ КРУГЛЫЙ Y) не совпадает с \ w

Все Идеограммы CJK классифицируются как «буквы» и, таким образом, соответствуют \ w

. Независимо от того, является ли какой-либо из вышеуказанных 3 пунктов проблемой, или нет, такой подход является лучшим, что вы получите из модуля re, выпущенного в настоящее время. Синтаксис типа \ p {letter} находится в будущем.

50
ответ дан John Machin 27 November 2019 в 23:55
поделиться

Вы можете использовать одно из следующих выражений, чтобы соответствовать одной букве:

(?![\d_])\w

или

\w(?<![\d_])

Здесь я соответствую \w, но проверьте, что [\d_] не соответствует ни до, ни после этого.

Из документов:

(?!...)
Matches if ... doesn’t match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it’s not followed by 'Asimov'.

(?<!...)
Matches if the current position in the string is not preceded by a match for .... This is called a negative lookbehind assertion. Similar to positive lookbehind assertions, the contained pattern must only match strings of some fixed length and shouldn’t contain group references. Patterns which start with negative lookbehind assertions may match at the beginning of the string being searched.
0
ответ дан sshilovsky 27 November 2019 в 23:55
поделиться

Как насчет:

\p{L}

Вы можете использовать этот документ в качестве справки: Регулярные выражения Unicode

Редактировать: Кажется Python не обрабатывает выражения Unicode . Взгляните в эту ссылку: Обработка акцентированных персонажей с регулярными выражениями Python - [AZ] просто не достаточно хорошо (больше не активна, ссылка на интернет-архив)

Другие ссылки:


Для потомки, вот примеры в блоге:

import re
string = 'riché'
print string
riché

richre = re.compile('([A-z]+)')
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('(\w+)',re.LOCALE)
match = richre.match(string)
print match.groups()
('rich',)

richre = re.compile('([é\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

richre = re.compile('([\xe9-\xf8\w]+)')
match = richre.match(string)
print match.groups()
('rich\xe9',)

string = 'richéñ'
match = richre.match(string)
print match.groups()
('rich\xe9\xf1',)

richre = re.compile('([\u00E9-\u00F8\w]+)')
print match.groups()
('rich\xe9\xf1',)

matched = match.group(1)
print matched
richéñ
2
ответ дан 27 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

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