Я не думаю, что lookingAt()
является правильной моделью для того, что вы пытаетесь сделать. Все, что он делает, это привязывает совпадение к началу ввода, как если бы вы использовали ^
start anchor в начале вашего регулярного выражения и вызывали find()
, и это было бы тривиально для эмуляции в .NET.
Я думаю, что вы пытаетесь запретить пользователям вводить неверные данные. Например, если текстовое поле ожидает десятичное число с двумя десятичными знаками, регулярное выражение проверки может быть \d+\.\d\d
. Если пользователь начинает с ввода цифры, регулярное выражение не совпадает, но цифра может быть частью действительной записи, поэтому вы можете позволить им продолжать вводить. Но если пользователь вводит «z», вы блокируете его, потому что он никак не может быть частью допустимой записи.
Другими словами, вы не хотите знать, соответствует ли регулярное выражение части строки, вы хотите знать, соответствует ли строка части регулярного выражения. В Java есть способ сделать это, используя метод hitEnd()
, но я не думаю, что .NET имеет аналог для этого. На самом деле, я не знаю ни одного другого аромата регулярных выражений.
Но блокировка клавиш пользователей в любом случае довольно грубая, на мой взгляд. Я предпочитаю сообщить им другими способами, что их ввод недействителен. Например, вы можете отобразить содержимое текстового поля красным или отключить кнопку, которую они используют для отправки записи (или и то, и другое). Каждый раз, когда что-то меняется в текстовом поле, вы проверяете содержимое по своему (полному) регулярному выражению и соответственно обновляете состояние поля и / или кнопки.
Вот демонстрация hitEnd()
:
import java.util.regex.*;
public class Test
{
public static void main(String[] args) throws Exception
{
Pattern p = Pattern.compile("\\d+\\.\\d\\d");
Matcher m = p.matcher("");
String[] tests = { "5.99", "5", "@" };
for (String s : tests)
{
if (m.reset(s).matches())
{
System.out.println("full match");
}
else if (m.hitEnd())
{
System.out.println("partial match");
}
else
{
System.out.println("no match");
}
}
}
}
Я получаю «полное совпадение» для первой строки, «частичное совпадение» для второй и «нет совпадения» для третьей.