регулярное выражение в строковом разделении JavaScript, проблеме совместимости браузера

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

Предположим, я хочу проверить Math.add():

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

@ParameterizedTest
@CsvSource({ "1,1,2",
            "2,2,4",
            "3,3,6",
            "4,4,8",
            "5,5,10",
            "6,6,12",
            "7,7,14",
            "10,90,100" })
public void parameterizedTest(int left, int right, int expected) {
    assertEquals(expected, Math.addExact(left, right));
}

Динамическая версия теста выглядит следующим образом:

@TestFactory
Collection<DynamicTest> dynamicTest() {
    return Arrays.asList(
      DynamicTest.dynamicTest("Test1", () -> assertEquals(2, Math.addExact(1, 1))),
      DynamicTest.dynamicTest("Test2", () -> assertEquals(4, Math.addExact(2, 2))),
      DynamicTest.dynamicTest("Test3", () -> assertEquals(6, Math.addExact(3, 3))),
      DynamicTest.dynamicTest("Test4", () -> assertEquals(8, Math.addExact(4, 4))),
      DynamicTest.dynamicTest("Test5", () -> assertEquals(10, Math.addExact(5, 5))),
      DynamicTest.dynamicTest("Test6", () -> assertEquals(12, Math.addExact(6, 6))),
      DynamicTest.dynamicTest("Test7", () -> assertEquals(14, Math.addExact(7, 7))),
      DynamicTest.dynamicTest("Test8", () -> assertEquals(100, Math.addExact(10, 90))));
}

У него уже есть много шаблонных кодов. Поэтому я пытаюсь использовать return Stream<DynamicTest> для удаления этих шаблонных кодов:

@TestFactory
Stream<DynamicTest> dynamicTest2() {

    return Stream.of(
                "1,1,2", 
                "2,2,4", 
                "3,3,6",
                "4,4,8" ,
                "5,5,10" , 
                "6,6,12" ,
                "7,7,14", 
                "10,90,100")
                //How to do????????
            .map(data-> DynamicTest.dynamicTest(data, () -> assertEquals(xxx, Math.addExact(yy,zz))));
}

Но как я могу преобразовать мои тестовые данные в формате строки в аргументы и вызвать SUT. Я оглядываюсь по DynamicTest API, чтобы увидеть, может ли что-нибудь помочь мне, но не могу найти ничего полезного, поэтому я сдаюсь .....

1112 Итак, я бы предпочел параметризованный тест. Более элегантно, чисто, легко читать и писать. Читаемость контрольного примера важнее.

5
задан Walt Jones 5 May 2009 в 00:21
поделиться

7 ответов

Причина, по которой ваш код не работает, заключается в том, что IE анализирует HTML и переводит теги в верхний регистр, когда вы читаете его через innerHTML. Например, если у вас есть такой HTML:

<div id='box'>
Hello<br>
World
</div>

А затем вы используете этот Javascript (в IE):

alert(document.getElementById('box').innerHTML);

Вы получите окно предупреждения со следующим:

Hello<BR>World

Обратите внимание на
теперь в верхнем регистре. Чтобы исправить это, просто добавьте флаг i в дополнение к флагу g , чтобы регулярное выражение не учитывало регистр, и оно будет работать так, как вы ожидаете.

15
ответ дан 18 December 2019 в 07:10
поделиться

Попробуйте это:

/<br[^>]*>/gi
6
ответ дан 18 December 2019 в 07:10
поделиться

Вместо

/<br.*?>/

вы можете попробовать

/<br[^>]*>/

, т. Е. Сопоставить ", за которыми следуют любые символы, кроме '>' , затем '>' .

1
ответ дан 18 December 2019 в 07:10
поделиться

Ну, к сожалению, у меня нет большого количества браузеров на работе (только IE - вздох), но я сразу вижу способ оптимизировать ваше регулярное выражение:

T = captions.innerHTML.split(/<br[^>]*?>/g);

встроенное определение класса символов [^>] указывает выражению совпадать с любым символом, КРОМЕ знака больше чем. Вы также можете сделать это без учета регистра (передайте gi в конце, а не просто g).

0
ответ дан 18 December 2019 в 07:10
поделиться

<\ s br \ s /? \ S *>

соответствует

<br>, <br />, < br >,<br / >

Я тестировал здесь в IE.6. Если с маршем все в порядке, то js может его разделить в соответствии с регулярным выражением.

0
ответ дан 18 December 2019 в 07:10
поделиться

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно проанализировать XML и HTML с помощью регулярного выражения? , почему). Что вам нужно, это HTML-парсер. См. . Можете ли вы привести пример парсинга HTML с вашим любимым парсером? для примеров использования различных парсеров.

В частности, вас может заинтересовать ответ JavaScript + DOM .

0
ответ дан 18 December 2019 в 07:10
поделиться

Проверено в Firefox 3 и IE7:

/<br.*?>/gi

Попробуйте сами здесь: http://jsbin.com/ofoke

var input = "one <br/>\n" 
          + "two <br />\n" 
          + "three <br>\n" 
; 

alert(input.replace(/<br.*?>/gi, ''));
0
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

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