-
1. Data: 2020-04-06 18:09:08
Temat: problem z wyrażeniem regularnym w C++
Od: RM <r...@w...pl>
Chciałbym w C++ dla line == "private $ci;" wyodrębnić wyrażeniem
regularnym identyfikator "ci". Napisałem w C++:
regex_match(line, matches2, regex("\\$((\\w|\\d|_)+)")))
i to wywołanie zwraca mi false. Co robię źle?
Używam #include <regex> (w Linuxie). W PHP to wyrażanie regularne mi działa.
-
2. Data: 2020-04-07 19:07:37
Temat: Re: problem z wyrażeniem regularnym w C++
Od: RM <r...@w...pl>
Potrzebuję jeszcze pomocy przy przetumaczeniu kawałka kodu z PHP na C++,
bo dokumentacji do C++owego sub_match nie rozumiem. Problem jest dla
mnie za trudny.
W PHP mam:
preg_match_all($r, $line, $matches, PREG_OFFSET_CAPTURE))
...
$match = $matches[$indexes[$what][$k]];
$delta_str = 0;
foreach ($match as $m) {
if ($what == 'f' && $k == 1) { // 2nd regexp for functions
// check if a method call:
$before = substr($line, $m[1] - 2, 2);
if ($before == '->' || $before == '::') continue; // don't obfuscate now
}
if ($what == 'f') { // case insensitive
$n = array_search(strtoupper($m[0]), $from[$what]);
} elseif ($what == 'm') { // case insensitive
if (in_array(strtoupper($m[0]), $from['a'])) { // action
$n = FALSE;
} else {
$n = array_search(strtoupper($m[0]), $from[$what]);
}
} else {
$n = array_search($m[0], $from[$what]);
}
if ($n !== FALSE) {
$line = substr_replace($line, '_' . $to[$what][$n], $m[1] +
$delta_str, strlen($m[0]));
$delta_str += strlen($to[$what][$n]) - strlen($m[0]) + 1;
}
}
W C++ wyobrażam sobie tak:
short delta_str = 0;
sub_match match = matches[indexes[what][k]];
for (auto m = match.begin(); m < match.end(); m++) {
if (what == i_functions && k == 1) { // 2nd regexp for functions
// check if a method call:
string before = line.substr(m.position() - 2, 2);
if (before == "->" || before == "::") {
continue; // don't obfuscate now
}
}
if (what == i_functions) { // case insensitive
n = strvector_search(strtoupper(m.str()), from[what]);
} else if (what == i_methods) { // case insensitive
if (in_strvector(strtoupper(m.str()), from[i_actions])) { // action
n = -1;
} else {
n = strvector_search(strtoupper(m.str()), from[what]);
}
} else { // case sensitive
n = strvector_search(m.str(), from[what]);
}
if (n >= 0) {
line = substr_replace(line, string("_").append(to[what][n]),
m.position() + delta_str, strlen(m.str().c_str()));
delta_str += strlen(to[what][n].c_str()) - strlen(m.str().c_str()) + 1;
}
}
Ale sub_match nie zawiera metod begin() i end() więc mój kod się nie
kompiluje. Prosiłbym bardzo o poprawienie kodu.
-
3. Data: 2020-04-08 15:49:28
Temat: Re: problem z wyrażeniem regularnym w C++
Od: RM <r...@w...pl>
Mój program to obsucator języka PHP i potrzebuję wyodrębnić wszysztkie
identyfikatory ([\\w|\\d|_)+ (właściwości OOP) dla wyrażenia regularnego
"(static)?\\s*(private|protected|public)\\s+(static)
?\\s*(\\$((\\w|\\d|_)+),?\\s*)+\\s*[^\\(]".
Tzn. problem polega na tym jak w C++ wyodrębnić wszystkie ciągi pasujące
do grupy (...) numer indexes[what][k] wyrażenia regularnego. Z tego co
się zorientowałem (ale nie jestem tego pewien) w przeciwieństwie do PHP
C++ wrzuca wszystkie dopasowania do jednej tablicy matches albo znajduje
tylko jedno dopasowanie sub_match dla każdej grupy (...). Ja natomiast
potrzebuję znaleźć wszystkie ciągi pasujące do grupy ((\\w|\\d|_)+)
(numer indexes[what][k]) a nie tylko jeden.
-
4. Data: 2020-04-08 16:39:50
Temat: Re: problem z wyrażeniem regularnym w C++
Od: RM <r...@w...pl>
Czy w C++ Regex są nazwane grupy przechwytujące i można ich użyć z
sub_match?
-
5. Data: 2020-04-09 21:44:41
Temat: Re: problem z wyrażeniem regularnym w C++
Od: Wojciech Muła <w...@g...com>
On Monday, April 6, 2020 at 6:09:09 PM UTC+2, RM wrote:
> Chciałbym w C++ dla line == "private $ci;" wyodrębnić wyrażeniem
> regularnym identyfikator "ci". Napisałem w C++:
> regex_match(line, matches2, regex("\\$((\\w|\\d|_)+)")))
> i to wywołanie zwraca mi false. Co robię źle?
> Używam #include <regex> (w Linuxie). W PHP to wyrażanie regularne mi działa.
regex_match: Determines if the regular expression e matches the entire target
character sequence.
regex_search: Determines if there is a match between the regular expression e and
some subsequence in the target character sequence.
Użyj tej drugiej funkcji.
Poza tym chyba masz błąd w wyrażeniu, złapie też $1234.
w.