Значения внутри конкретной скобки

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

-1
задан ankitpandey 13 July 2018 в 11:14
поделиться

2 ответа

Для ваших данных примера вы можете использовать:

(?s)\(\s*array\['nosql'\].*?\)\)

  • (?s) Режим для точка соответствует новой строке
  • \( Соответствие (
  • array\['nosql'\] Сопоставьте ноль или более раз пробельный символ, за которым следует array [nosql]
  • .*? Совпадение любого символа ноль или более раз не жадный
  • \)\) Матч ))

Демо

1
ответ дан The fourth bird 17 August 2018 в 13:05
поделиться

Вы можете использовать следующее регулярное выражение для извлечения интересующих данных:

(?<=\s(?=\(\sarray\['nosql'\]))([\s\w\['\]\s<@(.]*\)\))

  • (?<=\s(?=\(\sarray\['nosql'\])). Lookbehind, чтобы найти пробелы, за которыми следует открывающая скобка, и array['nosql'].
  • ([\s\w\['\]\s<@(.]*\)\)) Класс символов для сопоставления пробелов \s, буквенно-цифровых значений \w, квадратных скобок [ и ], символов <, @ и ). Наконец, сопоставьте заключительные два закрывающих скобки )).

Вы можете проверить его вживую здесь .


Питон:

>>import re
>>str = """2118|"((value5  IN('X5','X1','Y1.6','Z2.3','NO23') AND value1  NOT LIKE('%RISP%')) OR ( value5 is null  AND ( array['nosql'] 
<@ type_list AND (array['S4'] <@ value_list OR array['Z6'] <@ value_list OR array['C2.6'] 
<@ value_list OR array['C2.5'] <@ value_list OR array['NO24'] <@ value_list)) AND ( array['no_key'] 
<@ value_list AND NOT array['RISP'] <@ value_list))) AND SL IN 
('FS025','FS028','FS071','FPG01','FPG02','FPG03','FPG04','FPG05','FPG06','FPG07','FPG09','FPG10','FPG12','FPG13','FPG16','FPG17','FPG18',
'FPG19','FPG26','FPG28','FPG29','FPG30','FPG31','FPG34','FPG35','FPG40','FPG32','FPG45','FPG55','FPG56','FPG57','FPG58','FPG66','FPG97',
'FPG32','FPG33','FPG36','FPG37','FPG42','FPG59','FPG60')"|""|"CT"|"{FPG44,FPG09,FPG18,FPG59,FPG32,FPG11,FPG56,FPG03,FPG10,FPG58,FPG37,
FPG04,FPG17,FPG60,FPG66,FS025,FPG28,FPG12,FPG16,FPG07,FPG31,FPG34,FPG40,FPG06,FPG55,FPG36,FPG19,FPG30,FS028,FPG26,FPG97,FPG42,FPG01,
FPG29,FPG02,FS071,FPG33,FPG05,FPG45,FPG35,FPG13}"|""|"XSQC Target"|""|""|"1"|"Active"|""|"Speed ACP_ASiR"|"""""

>>data = re.findall(r"(?<=\s(?=\(\sarray\['nosql'\]))([\s\w\['\]\s<@(.]*\)\))",str)
>>print(data)

["( array['nosql'] \n<@ type_list AND (array['S4'] <@ value_list OR array['Z6'] <@ value_list OR array['C2.6'] \n<@ value_list OR array['C2.5'] <@ value_list OR array['NO24'] <@ value_list))"]
1
ответ дан UnbearableLightness 17 August 2018 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: