Совпадение плавающего числа в powershell - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблемы с сопоставлением строк HTML с PowerShell. Последние два элемента td имеют одно целое число (1) и число с плавающей запятой (11,793). Число 73480 никогда не меняется. Эти числа (1 и 11,793) могут переключать их тип (целое число <=> с плавающей запятой). Когда я использую [+-]?([0-9]*[.])?[0-9]+, в этом случае код не работает. Есть идеи как это исправить?

$web = @"
  <tr bgcolor=#fbf6e9>
    <td align="center">73480    </td>
    <td align="left">Сазлийка    </td>
    <td align="left">Гълъбово    </td>
    <td align="right">1    </td>
    <td align="right">11,793    </td>
  </tr>
"@
[regex]::Match($web,@"
  <tr bgcolor=#fbf6e9>
    <td align="center">73480    </td>
    <td align="left">(\w+)    </td>
    <td align="left">(\w+)    </td>
    <td align="right">([+-]?([0-9]*[.])?[0-9]+)    </td>
    <td align="right">([+-]?([0-9]*[.])?[0-9]+)    </td>
  </tr>
"@).Groups[1,2,3,4].Value

После выполнения команды вывод отсутствует (пустой результат).

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Синтаксический анализ регулярных выражений никогда не рекомендуется для HTML.

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

# (tested in pwsh v5.1)
([xml]'
  <tr bgcolor="#fbf6e9">
    <td align="center">73480    </td>
    <td align="left">Сазлийка    </td>
    <td align="left">Гълъбово    </td>
    <td align="right">1    </td>
    <td align="right">11,793    </td>
  </tr>
').tr.td | % { $_.'#text'.Trim() }

Вывод:

73480
Сазлийка
Гълъбово
1
11,793

(Имейте в виду, что вы должны использовать кавычки для значений атрибута, чтобы сделать его действительным XML.)

0 голосов
/ 15 ноября 2018

Ваш текст имеет десятичную запятую, но ваше регулярное выражение пытается соответствовать [.].
Я также заменил бы все несколько пробелов в регулярном выражении на \s*
Выбранные вами группы не учитывают необязательную подгруппу, перехватывающую первую дробь.

$web = @"
  <tr bgcolor=#fbf6e9>
    <td align="center">73480    </td>
    <td align="left">SampleOne    </td>
    <td align="left">SampleTwo    </td>
    <td align="right">1    </td>
    <td align="right">11,793    </td>
  </tr>
"@

$RE = @"
\s*<tr bgcolor=#fbf6e9>
\s*<td align="center">73480\s*</td>
\s*<td align="left">(\w+)\s*</td>
\s*<td align="left">(\w+)\s*</td>
\s*<td align="right">([+-]?([0-9]*[,\.])?[0-9]+)\s*</td>
\s*<td align="right">([+-]?([0-9]*[,\.])?[0-9]+)\s*</td>
\s*</tr>
"@
[regex]::Match($web,$RE).Groups[1,2,3,5].Value

возвращается сюда:

SampleOne
SampleTwo
1
11,793
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...