Вы не можете применять кванторы к якорям. Вместо этого, чтобы ограничить длину входной строки, используйте lookahead, привязанный в начале:
^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^
Кроме того, я предполагаю, что вы хотите совместить 0 или более букв или цифр с (a-z|A-Z|0-9)*
. Он должен выглядеть как [a-zA-Z0-9]*
(т. Е. Использовать здесь класс символов).
Почему бы не использовать ограничивающий квантификатор, например {1,15}
, в конце?
Квантификаторы применяются только в подшаблон слева, будь то группа или класс символов или буквальный символ. Таким образом, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$
будет эффективно ограничивать длину второго класса символов [^$%^&*;:,<>?()\"']
до 1 - 15 символов. ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$
будет «ограничивать» последовательность из двух подшаблонов неограниченной длины (так как *
(и +
тоже может совпадать с неограниченным количеством символов) в 1-15 раз, и мы по-прежнему не ограничиваем длина цельной входной строки .
Как работает ограничение на просмотр?
Правильно выглядит (?=.{1,15}$)
позитивный просмотр после ^
начало строки anchor . Это утверждение нулевой ширины , которое возвращает только true или false после проверки того, соответствует ли его подшаблон последующим символам. Таким образом, этот lookahead пытается сопоставить любые 1-15 (из-за символов limit quantifier {1,15}
), но строки новой строки в конце строки (из-за якоря $
). Если мы удалим якорь $
из lookahead, в lookahead потребуется только строка , содержащая от 1 до 15 символов, но общая длина строки может быть любой.
Если входная строка может содержать последовательность строк новой строки, вы должны использовать конструкцию регулярного выражения [\s\S]
с любым символом (она будет работать в JS и других общих вариантах регулярных выражений):
^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^^^^^^^
Ответ МаркФельдмана сработал, но возникла проблема с событием щелчка мышью. При использовании элемента Padding on the Border щелчки мыши не регистрируются при щелчке в области дополнения между текстовыми элементами. Чтобы исправить это, я заменил Border на StackPanel и переместил Padding на TextBlock. Заполнение самого текстового блока правильно регистрирует щелчок.
Окончательный xaml:
<UserControl.Resources>
<ResourceDictionary>
<ControlTemplate x:Key="AppleItemTemplate">
<StackPanel Opacity="1">
<TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ControlTemplate>
<ControlTemplate x:Key="AppleItemTemplateSelected">
<StackPanel Background="{DynamicResource LeftSidebarBGColorHighlight}">
<TextBlock Padding="10,5" Foreground="{DynamicResource PrimaryTextColor}">
<TextBlock.Text>
<Binding Path="DisplayName"/>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</ControlTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="AppleContainerStyle">
<Setter Property="Template" Value="{DynamicResource AppleItemTemplate}"/>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Template" Value="{DynamicResource AppleItemTemplateSelected}"/>
<Setter Property="BorderThickness" Value="0"/>
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
Если вы просто хотите удалить границу выбранного элемента, попробуйте следующее:
Добавьте <Setter Property="BorderThickness" Value="0"/>
в триггер «IsSelected».
В моей демонстрации я нашел, что это работает.