Парсинг строки, содержащей, вышел из символов с помощью Java

Ваш цикл .item-name предполагает, что их несколько, но затем снова выбирает .item-name, ожидая текстовых значений.

Вместо этого переберите родителей, затем найдите дочерние элементы для манипуляции, например:

$("table tbody tr").each(function() {
  if ($(this).find(".item-name").text() == 'Chair' && $(this).find(".item-weight").text() >= 20.0) {
    $(this).css("font-weight", "bold")
      .css("background-color", "red");
  } else {
    $(this).css("font-weight", "normal");
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="col-xs-12">
  <table class="table table-striped table-responsive">
    <thead>
      <tr>
        <td colspan="8" class="room-report-heading-td">
          <div class="room-report-heading">
            <div class="each-room  pull-left">
              <span class="room-number">1.</span>
              <span class="room-name">Room</span>
            </div>
            <div class="each-room-statistics pull-right">
              <span class="room-stat">
              1 items
              •
              5.0ft<sup>3</sup>
              •
              20.0lb
            </span>
            </div>
            <br style="clear:both;">
          </div>
        </td>
      </tr>
      <tr class="columns-headings">
        <th class="item-count">Count</th>
        <th class="item-name">Name</th>
        <th class="item-volume">Volume</th>
        <th class="item-total-volume">Total Volume</th>
        <th class="item-weight">Weight</th>
        <th class="item-total-weight">Total weight</th>
      </tr>
    </thead>
    <tbody>

      <tr>
        <td class="item-count"><span>1</span></td>
        <td class="item-name"><span>Chair</span></td>
        <td class="item-volume"><span>5.0</span></td>
        <td class="item-total-volume"><span>5.0</span></td>
        <td class="item-weight"><span>20.0</span></td>
        <td class="item-total-weight"><span>20.0</span></td>
      </tr>

      <tr>
        <td class="item-count"><span>1</span></td>
        <td class="item-name"><span>Bed</span></td>
        <td class="item-volume"><span>5.0</span></td>
        <td class="item-total-volume"><span>5.0</span></td>
        <td class="item-weight"><span>60.0</span></td>
        <td class="item-total-weight"><span>20.0</span></td>
      </tr>
    </tbody>
  </table>

[118 ] Обратите внимание, что если у вас есть много таблиц на странице, вам нужно проявить творческий подход в поиске конкретной, просто нужно знать путь к ней.

5
задан paxdiablo 10 May 2009 в 12:24
поделиться

2 ответа

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

split("[^\\];")

Разделить все, что есть ";" но не если перед этим стоит "\". То же самое для тире:

split("[^\\]-")
7
ответ дан 18 December 2019 в 13:19
поделиться

Вам, вероятно, лучше всего будет выполнить отмену экранирования и разделение в одном проходе. Я знаю, что это неправильно с точки зрения разделения двух отдельных частей функциональности, но это позволяет избежать некоторых неудобных угловых случаев (представьте, например, "foo \; bar", где; следует за обратной косой чертой, но по-прежнему является разделителем).

Вот очень упрощенный код для синтаксического анализа - он предполагает, что любая обратная косая черта в основном означает «обрабатывать следующий символ как простой ввод», но это все.

import java.util.*;

public class Test
{
    public static void main(String[] args)
    {
        List<String> parsed = parse(args[0]);
        for (String x : parsed)
        {
            System.out.println(x);
        }
    }

    public static List<String> parse(String text)
    {
        List<String> ret = new ArrayList<String>();
        StringBuilder current = new StringBuilder();
        boolean escaping = false;

        for (int i=0; i < text.length(); i++)
        {
            char c = text.charAt(i);
            if (escaping)
            {
                current.append(c);
                escaping = false;
            }
            else
            {
                if (c == '\\')
                {
                    escaping = true;
                }
                else if (c == ';')
                {
                    ret.add(current.toString());
                    current = new StringBuilder();
                }
                else
                {
                    current.append(c);
                }
            }
        }
        if (escaping)
        {
            throw new IllegalArgumentException("Ended in escape sequence");
        }
        ret.add(current.toString());
        return ret;
    }
}

(Обратите внимание, что это не позволяет разбивать каждую запись на несколько поля, но вам просто нужно изменить то, что вы делаете с помощью ';', а также реагировать на '-' - принцип тот же.)

7
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

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