Думаю, у вас есть две строки - не в вашем коде, а для чтения из файла или JTextField:
s = "\<$foo$>";
p = "[^\\]?<\$[^\$]*\$>";
И вы хотите сопоставить шаблон со строкой.
Что я сделал до сих пор:
- Группа, которая не содержит обратную косую черту
[^\\]?
, но может быть необязательной.
<$
, где Доллар, как специальное регулярное выражение, должен маскироваться обратной косой чертой, как и обратная косая черта ранее.
- Группа
[^\$]*
, в которой нет другого доллара свободной длины.
- Доллар с
\$>
больше, чем. Опять же: доллар в маске.
Вопрос для вашего домена заключается в том, может ли foo-часть или что-то_we_dont_care_what содержать знак доллара, за которым не следует >
. Я предположил, что нет.
s.match (p);
Должен теперь возвращать true или false, но проблема в том, как вставить это в ваш код. Проблема в том, что не только регулярное выражение, но и сама Java обрабатывает обратную косую черту как маскирующий символ. Таким образом, вы должны удвоить каждый из них:
p = "[^\\\\]?<\\$[^\\$]*\\$>";
Если контрольный пример также является буквальным текстом в вашем коде, это относится и к нему:
"\\<$foo$>".matches (p);
Испытание их часто является хорошей идеей, если у вас есть инструмент, в котором вы можете сначала пропустить маскирование Java - простой графический интерфейс с двумя JTextFields или код, который считывает шаблон из файла свойств, что избавляет вас от повторных перекомпиляций.
public class PM
{
public static void main (String args[])
{
String bad = "\\<$foo$>";
String good = "<$foo$>";
String p = "[^\\\\]?<\\$[^\\$]*\\$>";
System.out.println ("bad:\t" + bad.matches (p));
System.out.println ("good:\t" + good.matches (p));
}
}