Как вы используете переменную в регулярном выражении?

Вот метод, который возвращает методы с конкретными аннотациями:

public static List getMethodsAnnotatedWith(final Class type, final Class annotation) {
    final List methods = new ArrayList();
    Class klass = type;
    while (klass != Object.class) { // need to iterated thought hierarchy in order to retrieve methods from above the current instance
        // iterate though the list of methods declared in the class represented by klass variable, and add those annotated with the specified annotation
        final List allMethods = new ArrayList(Arrays.asList(klass.getDeclaredMethods()));       
        for (final Method method : allMethods) {
            if (method.isAnnotationPresent(annotation)) {
                Annotation annotInstance = method.getAnnotation(annotation);
                // TODO process annotInstance
                methods.add(method);
            }
        }
        // move to the upper class in the hierarchy in search for more methods
        klass = klass.getSuperclass();
    }
    return methods;
}

Его можно легко модифицировать в соответствии с вашими конкретными потребностями. Обратите внимание, что предоставленный метод обходит иерархию классов, чтобы найти методы с требуемыми аннотациями.

Ниже приведен метод для ваших конкретных потребностей:

public static List getMethodsAnnotatedWithMethodXY(final Class type) {
    final List methods = new ArrayList();
    Class klass = type;
    while (klass != Object.class) { // need to iterated thought hierarchy in order to retrieve methods from above the current instance
        // iterate though the list of methods declared in the class represented by klass variable, and add those annotated with the specified annotation
        final List allMethods = new ArrayList(Arrays.asList(klass.getDeclaredMethods()));
        for (final Method method : allMethods) {
            if (method.isAnnotationPresent(MethodXY.class)) {
                MethodXY annotInstance = method.getAnnotation(MethodXY.class);
                if (annotInstance.x() == 3 && annotInstance.y() == 2) {         
                    methods.add(method);
                }
            }
        }
        // move to the upper class in the hierarchy in search for more methods
        klass = klass.getSuperclass();
    }
    return methods;
}

Для вызова найденного метода (s) PLS ссылаются на учебник . Одной из потенциальных трудностей здесь является количество аргументов метода, которые могут варьироваться между найденными методами и, следовательно, требуют некоторой дополнительной обработки.

1179
задан daaawx 15 March 2019 в 19:58
поделиться

8 ответов

Вместо того, чтобы использовать /regex/g синтаксис, можно создать новое объект RegExp:

var replace = "regex";
var re = new RegExp(replace,"g");

можно динамично создать объекты regex этот путь. Затем Вы сделаете:

"mystring".replace(re, "newstring");
1674
ответ дан jcubic 16 March 2019 в 05:58
поделиться
  • 1
    Вы могли уточнить свой ответ для меня? Я вижу, что это работает, но, не уверенный, как использовать его с результатом людей, с именами, электронными письмами, и т.д. – Jonathan 14 April 2012 в 17:45

Это:

var txt=new RegExp(pattern,attributes);

эквивалентно этому:

var txt=/pattern/attributes;

См. http://www.w3schools.com/jsref/jsref_obj_regexp.asp .

29
ответ дан Jeremy Ruten 16 March 2019 в 05:58
поделиться
  • 1
    Вы могли объяснить свое измененное предложение немного? В какой точке это может тогда использоваться для итерации через новых людей результата в правильном порядке? Или сделал Вы комментируете потому что это wasn' t работа? Спасибо за Ваш вход, хотя, я нашел его очень полезным – Jonathan 14 April 2012 в 17:39
this.replace( new RegExp( replaceThis, 'g' ), withThis );
19
ответ дан Mike Samuel 16 March 2019 в 05:58
поделиться
  • 1
    Я, вероятно, должен был быть более ясным, что можно проводить вторую строку и присвоить ее или далее выполнить итерации на нее. Я также, вероятно, должен был запустить со своего альтернативного решения, хотя мне нравится начинать с небольшого количества кода и показывать возрастающие изменения, пока более идеальное решение не достигнуто;) – Brian Underwood 15 April 2012 в 23:31

"ABABAB".replace(/B/g, "A");

Как всегда: не используйте regex, если Вы не имеете к. Для замены простой строки идиома:

'ABABAB'.split('B').join('A')

Затем Вы не должны волноваться о проблемах заключения в кавычки, упомянутых в ответе Gracenotes.

107
ответ дан Liam 16 March 2019 в 05:58
поделиться

В то время как можно сделать динамично созданный RegExp (согласно другим ответам на этот вопрос), я повторю свой комментарий от подобное сообщение : функциональная форма String.replace () чрезвычайно полезен и во многих случаях уменьшает потребность в динамично созданных Объектах RegExp. (которые являются своего рода болью, потому что необходимо выразить вход конструктору RegExp как строка, а не использовать наклонные черты / [A-Z] + / regexp литеральный формат)

3
ответ дан Community 16 March 2019 в 05:58
поделиться

Как Eric Wendelin упомянул, можно сделать что-то вроде этого:

str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");

Это уступает "regex matching .". Однако это перестанет работать, если str1 будет ".". Вы ожидали бы, что результат будет "pattern matching regex", заменяя период "regex", но это окажется...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Это вызвано тем, что, хотя "." Строка, в конструкторе RegExp, она все еще интерпретируется как регулярное выражение, означая любой символ неразрыва строки, означая каждый символ в строке. С этой целью следующая функция может быть полезной:

 RegExp.quote = function(str) {
     return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
 };

Затем можно сделать:

str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");

получение "pattern matching regex".

195
ответ дан Qtax 16 March 2019 в 05:58
поделиться
String.prototype.replaceAll = function (replaceThis, withThis) {
   var re = new RegExp(replaceThis,"g"); 
   return this.replace(re, withThis);
};
var aa = "abab54..aba".replaceAll("\\.", "v");

Тест с этим инструмент

9
ответ дан unigogo 16 March 2019 в 05:58
поделиться
  • 1
    index_by является большим, но предостерегитесь при получении массива, заполненного идентификаторами HTTP. Проведите почти час для понимания этого [" 1" " 2" " 3"]! = [1, 2, 3]. – shadowhorst 14 February 2014 в 07:20

Это сам вызывание функции выполнит итерации по replacerItems использования индекса и изменит replacerItems [индекс] глобально на строке с каждой передачей.

  const replacerItems = ["a", "b", "c"];    

    function replacer(str, index){
          const item = replacerItems[index];
          const regex = new RegExp(`[${item}]`, "g");
          const newStr = str.replace(regex, "z");
          if (index < replacerItems.length - 1) {
            return replacer(newStr, index + 1);
          }
          return newStr;
    }

// console.log(replacer('abcdefg', 0)) will output 'zzzdefg'
0
ответ дан 19 December 2019 в 20:16
поделиться
Другие вопросы по тегам:

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