Więc mam określony ciąg zwrócony w następującej strukturze:

"http://www.google.com/search","XYZ","Some other Value","false","false","2017-12-13"

Chcę tylko znaleźć ostatnie wystąpienie daty z formatu „RRRR-MM-dd”, ponieważ może być również, że wartość „false” może zwracać datę.

Nie mam doświadczenia w wyrażeniach regularnych, ale ostatnią rzeczą, jaką osiągnąłem, było otrzymanie 2017-12-12"* za pomocą następującego wyrażenia:

**((?:[^"]"*){10})$**

Poszukiwanie daty w żądanym formacie nie pomoże, ponieważ może wystąpić wiele dat.

Dlatego chcę sprawdzić ostatni ciąg znaków w cudzysłowie. Jak otrzymam tę datę bez cudzysłowów?

0
Yolo Swaggins 19 listopad 2019, 18:30
Wypróbuj \d{4}-\d{2}-\d{2}(?="$)
 – 
ctwheels
19 listopad 2019, 18:36

4 odpowiedzi

Chcę sprawdzić ostatni ciąg w cudzysłowie

Właśnie:

regexp_replace(myvalue, '^.*"([^"]+)"$', '\1')

Podział Regexp:

^          beginning of the string
.*         any sequence of 0 to N characters
"          double quote
(          beginning of the capturing group
    [^"]+      as many characters as possible other than a double quote (at least one)
)          end of the capturing group
"          double quote
$          end of string

Wyrażenie regularne dopasowuje się do całego ciągu i zastępuje go częścią catpured.

Demo na DB Fiddle :

with t as (select '"http://www.google.com/search","XYZ","Some other Value","false","false","2017-12-13"' myvalue from dual)
select regexp_replace(myvalue, '^.*"([^"]+)"$', '\1') mydate from t
| MYDATE     |
| :--------- |
| 2017-12-13 |

W razie potrzeby można bardziej szczegółowo określić oczekiwany format daty w grupie przechwytywania:

regexp_replace(myvalue, '^.*"(\d{4}-\d{2}-\d{2})"$', '\1')
1
GMB 19 listopad 2019, 18:42

Aby to zrobić, możesz użyć następującego wyrażenia regularnego:

/^(?:".*?",)*"(.*?)"$/

Alternatywnie możesz użyć String#split() i String#slice():

const output=input
  .split(',')
  .pop()
  .slice(1,-1)
0
FZs 19 listopad 2019, 18:46

Użyj prostego regexp_substr w następujący sposób:

select regexp_substr('"http://www.google.com/search","XYZ","Some other Value","false","false","2017-12-13"',
'((\d){4}(-)(\d){2}(-)(\d){2})"$',1,1,null,1)
from dual;

db & lt; & gt; fiddle demo

Tutaj parametry regexp_substr są następujące:

REGEXP_SUBSTR( string, pattern [, start_position [, nth_appearance [, match_parameter [, sub_expression ] ] ] ] )

Twoje zdrowie!!

0
Popeye 19 listopad 2019, 18:48

Jeśli dobrze rozumiem, "false", "false", "2017-12-13" może być dowolną kombinacją trzech dat lub trzech false dat lub dowolnego miejsca pomiędzy, a chcesz znaleźć ostatnią datę. użyłbym

(\d{4}-\d\d-\d\d(?!.*\d{4}-\d\d-\d\d))

Który uchwyci datę, o ile nie nastąpi po niej następna.

Zobacz mój przykład tutaj:
https://regex101.com/r/GAkpDI/1/

"http://www.google.com/search","XYZ","Some other Value","2018-04-09","false","<<2017-12-13>>"
"http://www.google.com/search","XYZ","Some other Value","<<2018-12-09>>","false","false"
"http://www.google.com/search","XYZ","Some other Value","false","<<2000-09-17>>","false"
"http://www.google.com/search","XYZ","Some other Value","2018-12-09","2000-09-17","<<2017-12-13>>"

Umieściłem zapałki w <<>>.


Edytuj: jeśli nie znasz formatu daty, możesz zamienić ją na coś, co zawiera tylko liczby, myślniki i ukośniki:

https://regex101.com/r/GAkpDI/2/

([\d-\/]+(?!.*[\d-\/]+))

Jest bardziej prawdopodobne, że się nie powiedzie, ponieważ znajdzie wszystko [0123456789-/], ale jeśli twój program umieści tam tylko datę lub false, nadal powinien być wykonalny.

0
matthew-e-brown 19 listopad 2019, 18:58