Usuwanie nawiasów przy pomocy wyrażeń regularnych

0

Jest sobie String, który zaczyna się od "(((...(((", kończy ")))...))". Ilości nawiasów na początku i na końcu są takie same, wewnątrz nie ma nawiasów. Da sie przy pomocy wyrażeń regularnych usunąć nawiasy?
Przykład (((a + b - c))) => a + b - c.

0

Czy czymś przeszkadza zwykłe, głupie zastąpienie: "(" na: "" ?

0

Yyy, Ty pewnie jako doświadczony "Javowiec" pewnie wiesz jak to zrobić pod kątem kodu. Ja sprawdziłem na szybko w edytorze od FileManagera z pluginem ReSearch, że powinno działać takie wyszukanie wyrażenia \(\(\((.+?)\)\)\) i zamiana go na $1 czyli pierwszy matches czy jak to się fachowo nazywa. Podałem w pliku to co Ty i otrzymałem, to czego oczekujesz w swoim przykładzie.

0

@olesio, nie działa jak trzeba. Podane wyrażenie wymaga trzech nawiasów na końcu, co najmniej trzech z przodu i zupełnie się nie przejmuje nawiasami wewnątrz.

0

Czy można założyć że nawiasy w wyrażeniu są poprawne w sensie matematycznym?
Czy w przypadku: (((a + (b) - c))) nic nie robimy?

0

Jeżeli nie może być nawiasów wewnątrz, to na raz pozbędziesz się tylko pary nawiasów z Twojego przykładu. Według mnie musiałbyś powtarzać wyszukiwanie:

(\()[^\(\)]*(\))

W $1 i $2 będą znalezione nawiasy

0

Miałem małą nadzieję, że sprawę załatwi jedno wyrażenie raz użyte. Jak mam się bawić pętlami wyrażeń, to wolę w pętli policzyć nawiasy "(" na początku, ")" na końcu, oba rodzaje w środku i zastosować replace.

1

Ja nie rozumiem problemu.
Z opisu wynika, że nawiasy masz na początku i na końcu i są zawsze sparowane (parowanie ich nie jest istotne).
czyli takie coś powinno załatwić sprawę:
\(+(.?*)\)+ -> $1

Może podaj kilka przykładów co ma się zmienić na co i czy masz jakieś dziwne warunki brzegowe.

0

W sumie da się przeprowadzić dowód niemożliwości zrobienia tego za pomocą wyrażeń regularnych.
RegEx zamienia to na deterministyczną maszynę Turinga, zaś tego zadania nie da się opisać deterministyczną maszyną,
ponieważ ilość nawiasów na początku determinuje ilość węzłów/stanów, a zaś deterministyczna maszyna Turinga musi mieć z góry określoną ilość węzłów/stanów.

Czyli teoretycznie by się dało, o ile ograniczysz możliwą ilość prefiksowych/sufiksowych nawiasów do np. nie więcej niż 12

0

Jest jakiś feature reg expów, które powinny w tym pomóc.
Rekursja wygląda obiecująco. Pytanie jak w niej zmienić jeden znak ( na inny )?
http://www.regular-expressions.info/refrecurse.html

0
MarekR22 napisał(a):

... Rekursja wygląda obiecująco ...
Moze Recursion + Subroutine Call

0

Wygląda na to, że Java nie wspiera rekursji lub subrutine
Gdyby wspierała to IMO takie coś powinno załatwić sprawę:
\(((?0)|[\(\)]+)\)

ale najwyraźniej nie działa :( https://regex101.com/r/eG5oQ1/1 (trzeba kliknąć z lewej "unit tests")

0

Masz rację co do niewspierania rekursji w Javie. Pozostaje banalne liczenie nawiasów na początku i na końcu Stringa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1