Как я могу соответствовать серии |с регулярным выражением Java? - PullRequest
0 голосов
/ 26 сентября 2010

Пара вопросов:

1) Как заставить следующее регулярное выражение, основанное на поисковом литерале ^, работать для поискового литерала |

поисковый литерал ^ на основе регулярного выражения (которое работает нормально,который является одним из ценных материалов этого форума):

String intermediateResult = in.replaceAll( "(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\\^", "$1^" );
String finalResult = intermediateResult.replaceAll( "(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^([^\"\\^].*|\"[^\"].*))", "$1ST$2" );

Когда я заменяю ^ (где это необходимо) на |следующим образом - я не получаю желаемый результат (он ничего не меняет в данной строке):

String intermediateResult = in.replaceAll( "(TEST\\|[\\|\\|]*\\|[\\|\\|]*\\|[\\|\\|]*\\|[\\|\\|]*\\|)\"\"\\|", "$1|" );
String finalResult = intermediateResult.replaceAll( "(TEST\\|[\\|\\|]*\\\\|)(\\|[\\|\\|]*\\|[\\|\\|]*\\|([^\"\\^].*|\"[^\"].*))", "$1ST$2" );

Есть ли известные проблемы с |в регулярном выражении Java или мне нужно иметь регулярное выражение для поиска литерала |

Итак, я попробовал этот способ, но безуспешно (имея \\ | вместо \ |):

Первое регулярное выражение изменяет все места, которые похожи на | "" |в данной строке, хотя я ожидаю, что она будет пустой, только если содержимое между 5-м и 6-м появлением |есть "", не знаю почему.Второе регулярное выражение по какой-то причине вообще не меняет строку.

 String intermediateResult = in.replaceAll( "(TEST\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|)\"\"\\|", "$1|" );
String finalResult = intermediateResult.replaceAll( "(TEST\\|[\\|\\|]*\\\\|)(\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\|([^\"\\^].*|\"[^\"].*))", "$1ST$2" ); 

2) Кроме того, что подразумевается под частью совпадения и строкой замены этого регулярного выражения:

String finalResult = intermediateResult.replaceAll( "(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^
**([^\"\\^].*|\"[^\"].*)**)", "**$1ST$2**" );

Крайне извиняюсь за путаницу и длинный пост;Я собираюсь опубликовать только один вопрос и опубликовать другой вопрос в другом сообщении для ясности.

Разработка первого вопроса из исходного электронного письма:

У меня есть следующая строка(каждая строка отделена \ r \ n).Первое регулярное выражение, связанное с поиском литерала |предполагается, что содержимое между вторым и третьим вхождением |пусто, и если содержание между 5 и 6 |is "", затем оставьте это поле пустым.

2-е регулярное выражение (снова связанное с |) должно видеть, является ли содержимое между 5-м и 6-м появлением |не является пустым и не нулевым, затем создайте содержимое между вторым вхождением 2-го и 3-го как ST.

Пример следующим образом:

Существующая строка:

TEST|X||Y||**""**|C|""|\r\n\
TEST|Z||Y||SOMETHING OTHER THAN "" OR empty||\r\n\

Желаемыйвыводится, когда запускаются | связанные два регулярных выражения replaceall() из исходного сообщения:

TEST|X||Y|||C|""|\r\n\
TEST|Z|**ST**|Y||SOMETHING OTHER THAN "" OR empty||\r\n\

1 Ответ

1 голос
/ 26 сентября 2010

Я обнаружил одну ошибку в вашем преобразовании. Шаблон [^^] означает «символ, который не является« ^ »». Таким образом, чтобы преобразовать его в «|», это будет [^|] (внутри [] для | не требуется экранирования).

Теперь я собираюсь взять вилку и высунуть глаза. Я никогда не хочу видеть это снова.

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