Регулярное выражение для извлечения пар значения маркировки в Java

Произошла ошибка из-за отсутствия данных в переменной. Деревня появилась, но данных не было и произошел конфликт. Я создал asyncData

  async asyncData(){
        return {
          headSlogan: ""
        }
      },

Полный код

<template>
    <div class="westartslogan">
        <div class="head-slogan">
            <h2 v-html="headSlogan"></h2>
        </div>
        <h3>{{$t('page.home.wellcom_block_subtitle_left')}}</h3>
        <ul>
            <li><i class="icon"></i>
                <div v-html="$t('page.home.wellcom_block_option_1_left')"></div></li>
            <li><i class="icon"></i>
                <div v-html="$t('page.home.wellcom_block_option_2_left')"></div></li>
            <li><i class="icon"></i>
                <div v-html="$t('page.home.wellcom_block_option_3_left')"></div></li>
            <li><i class="icon"></i>
                <div v-html="$t('page.home.wellcom_block_option_4_left')"></div></li>
            <li><i class="icon"></i>
                <div v-html="$t('page.home.wellcom_block_option_5_left')"></div></li>
        </ul>

        <div class="startcalc-btn button-container">
            <nuxt-link   :to="getLocalizedRoute({ name: 'calculator' })"  class="uk-button uk-button-default">{{
                $t('page.home.wellcom_button_calculator') }}
            </nuxt-link >
        </div>
        <div class="ourproject-btn uk-hidden@s">
            <div class="button-container">
                <nuxt-link :to="getLocalizedRoute({ name: 'portfolio' })" class="uk-button uk-button-default">
                   {{ $t('page.home.wellcom_button_portfolio') }}
                </nuxt-link>
            </div>
        </div>
    </div>
</template>

<script>
  export default {
      async asyncData(){
        return {
          headSlogan: ""
        }
      },
      name: 'we_can',
      data () {
        return {
          filterHeadSlogan: '',
          headSlogan:  this.$i18n.t('page.home.wellcom_block_title_left'),
          windowWidth: 0
        }
      },
     methods: {
       getWindowWidth (event) {
         this.windowWidth = document.documentElement.clientWidth
         if (this.windowWidth >= 960) {
           this.headSlogan = this.headSlogan
         } else {
           var str = this.headSlogan
           this.headSlogan = str.replace(/<\/?[^>]+(>|$)/g, '')
         }
       }
     },
    mounted() {
      this.$nextTick(function () {
        window.addEventListener('resize', this.getWindowWidth);
          //Init
          this.getWindowWidth()
      })
    }

  }
</script>

<style scoped>

</style>
7
задан Guido 26 December 2008 в 20:21
поделиться

7 ответов

Я не знаю, что regex Java возражает, что хорошо, но что-то вроде этого шаблон сделает это:

^Address:\s*((?:(?!^\w+:).)+)$

принимающая мультилиния и dotall режимы идут.

Это будет соответствовать любой строке, запускающейся с Адреса, сопровождаемого чем-либо до символа новой строки и отдельного слова, сопровождаемого двоеточием.

Если Вы знаете, что следующим полем должна быть "Страна", можно упростить это немного:

^Address:\s*((?:(?!^Country:).)+)$

Прием находится в предварительном утверждении в повторяющейся группе'. (?! Страна:)'. будет соответствовать всему кроме запуска строки 'Страна': таким образом, мы просто засовываем его в неполучение круглых скобок (?:...), и определяют количество его с +, затем группа все это в нормальных круглых скобках получения.

6
ответ дан 6 December 2019 в 19:43
поделиться

Принятие "содержания" является строкой, содержащей содержание файла, Ваша основная проблема состоит в том, что Вы используете matches() где необходимо использовать find().

Pattern p = Pattern.compile("^Address:\\s*(.*)$", Pattern.MULTILINE);
Matcher m = p.matcher(content);
if ( m.find() )
{
  ...
}

Кажется, существует некоторый беспорядок в других ответах о режимах MULTLINE и DOTALL. МУЛЬТИЛИНИЯ - то, что позволяет ^ и $ привязки соответствуют началу и концу, соответственно, логической строки. DOTALL позволяет точке (период, точка, безотносительно) соответствуют символам разделителя строк как \n (перевод строки) и \r (возврат каретки). Этот regex должен использовать режим MULTILINE и не должен использовать режим DOTALL.

3
ответ дан 6 December 2019 в 19:43
поделиться

Вы могли бы хотеть изучить Properties класс вместо regex. Это предоставляет Вам способы управлять простым текстом или XML-файлами для представления пар "ключ-значение".

Таким образом, можно читать в файле в качестве примера и затем получить значения как поэтому после загрузки в a Properties объект:

Properties properties = new Properties();
properties.load(/* InputStream of your file */);

Assert.assertEquals("Peter", properties.getProperty("Name"));
Assert.assertEquals("St. Serrano número 12, España", properties.getProperty("Address"));
Assert.assertEquals("Spain", properties.getProperty("Country"));
3
ответ дан 6 December 2019 в 19:43
поделиться

Я не означаю быть палкой в грязи, но необходимо ли использовать regex? Почему бы не сэкономить Ваше будущее сам (или другие) головная боль и сделать:

String line = reader.readLine();
while(line != null)
{
    line = line.trim();
    if(line.startsWith("Address: "))
    {
        return line.substr("Address: ".length()).trim();
    }
    line = reader.readLine();
}
return null;

Конечно, это может быть параметризовано немного также и помещено в метод.

Иначе я был бы второй Свойства или предложения JYaml.

1
ответ дан 6 December 2019 в 19:43
поделиться

Не человек Java, но не был бы a "Address: (.*)$" работа?

Править: Без Шаблона. МУЛЬТИЛИНИЯ | Шаблон. Опция DOTALL это должно соответствовать только на той строке.

0
ответ дан 6 December 2019 в 19:43
поделиться

Это может содержать новую строку? Если это не может содержать новую строку, Вы не должны использовать многострочный модификатор и можете сделать вместо этого

Pattern p = Pattern.compile("^Address: (.*)$");

Если это может, альтернатива, о которой я могу думать,

Pattern p = Pattern.compile("Address: (.*)\nCountry", Pattern.MULTILINE);

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

0
ответ дан 6 December 2019 в 19:43
поделиться

Необходимо определенно проверить YAML.

Вы могли попробовать JYaml.

Лучший из всего это имеет реализации на многих языках.

PS я попробовал демонстрационный текст в YAML:: XS, и это работает отлично.

0
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

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