Шпаргалка по регулярным выражениям

Поиск с помощью Arrays.binarySearch()

Класс Arrays содержит набор методов с именем binarySearch(). Этот метод поможет вам выполнить бинарный поиск в массиве. Сначала массив должен быть отсортирован. Вы можете сделать это самостоятельно или с помощью метода Arrays.sort(), описанного ранее в этом тексте. Вот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 6);

System.out.println(index);

Вторая строка этого примера ищет в массиве значение 6. Метод binarySearch() возвращает индекс в массиве, в котором был найден элемент. В приведенном выше примере метод binarySearch() вернет 3.

Если в массиве существует более одного элемента с искомым значением, нет гарантии, какой элемент будет найден.

Если элемент с данным значением не найден, будет возвращено отрицательное число. Отрицательным числом будет индекс, по которому будет вставлен искомый элемент, а затем минус один. Посмотрите на этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 7);

System.out.println(index);

Число 7 не найдено в массиве. Номер 7 должен был быть вставлен в массив по индексу 4, если 7 должен был быть вставлен в массив (и порядок сортировки сохранен). Следовательно, binarySearch() возвращает -4 – 1 = -5.

Если все элементы в массиве меньше искомого значения, то двоичная Search() вернет – длина массива – 1. Посмотрите на этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 12);

System.out.println(index);

В этом примере мы ищем 12 в массиве, но все элементы в массиве меньше 12. Поэтому binarySearch() вернет -length(-6) – 1 = -6 -1 = -7.

Метод Arrays.binarySearch() для поиска части массива. Вот как это выглядит:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 0, 4, 2);

System.out.println(index);

В этом примере выполняется поиск в массиве значения 2, но только между индексами 0 и 4 (без 4).

Эта версия binarySearch() работает так же, как и другая версия, за исключением случаев:

  • Если не найдено ни одного элемента, совпадающего в пределах интервала индекса, то все равно вернется индекс того места, где должно было быть вставлено значение.
  • Если все значения в интервале меньше искомого значения, вернется -toIndex -1, а не -array length – 1.

Таким образом, этот пример:

int[] ints = {0,2,4,6,8,10};

int index = Arrays.binarySearch(ints, 0, 4, 12);

вернет -5, а не -7, как в двоичном поиске (целых, 12).

Итерация

Как перебрать все элементы массива, используя цикл Java for:

String[] stringArray = new String;

for(int i=0; i < stringArray.length; i++) {
    stringArray = "String no " + i;
}

for(int i=0; i < stringArray.length; i++) {
    System.out.println( stringArray );
}

В этом примере:

  1. Сначала создается массив ссылок String. Когда  впервые создаете массив ссылок на объекты, каждая из ячеек в массиве указывает на ноль, а не на объект.
  2. Первый из двух циклов for выполняет итерацию по массиву String, создает строку и делает ссылку на ячейку этой строкой.
  3. Второй из двух циклов for перебирает массив String и печатает все строки, на которые ссылаются ячейки.

Если бы это был массив int (примитивные значения), он мог бы выглядеть так:

int[] intArray = new int;

for(int i=0; i < intArray.length; i++) {
    intArray = i;
}

for(int i=0; i < intArray.length; i++) {
    System.out.println( intArray );
}

Переменная i инициализируется равной 0 и работает до длины массива минус 1. В этом случае i принимает значения от 0 до 9, каждый раз повторяя код внутри цикла for один раз, и для каждой итерации i имеет другое значение.

Как перебрать массив с помощью цикла «for-each» в Java. Вот как это выглядит:

int[] intArray = new int;

for(int theInt : intArray) {
    System.out.println(theInt);
}

Цикл for-each дает вам доступ к каждому элементу в массиве по одному, но не информацию об индексе каждого элемента. Есть доступ только к значению. Изменить значение элемента в этой позиции невозможно. Если это нужно, используйте обычный цикл for, как показано ранее.

Цикл for-each также работает с массивами объектов. Вот пример, как выполнить итерацию массива объектов String:

String[] stringArray = {"one", "two", "three"};

for(String theString : stringArray) {
    System.out.println(theString);
}

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Начиная с Java 7 , мы познакомились с классом , в котором доступно несколько , таких как , , и среди прочих.

Каждая имеет и метод, который принимает (который , такую же, как ). С практической точки зрения – это означает, что мы можем вставить строку в методы .

Метод возвращает , который мы можем легко снова превратить в строку.

Ранее, когда мы использовали наш метод , мы сохраняли полученные байты в массиве байтов, но при использовании класса все немного по-другому. Сначала нам нужно использовать класс для хранения наших байтов. Затем нам нужно как кодировать , так и декодировать обратно наши недавно выделенные байты. Давайте посмотрим, как это работает в коде:

String japaneseString = "よろしくお願いします"; // Pleased to meet you.

ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode(japaneseString);

String utf8String = new String(byteBuffer.array(), StandardCharsets.UTF_8);
System.out.println(utf8String);

Выполнение этого кода приводит к:

よろしくお願いします

Закодируйте строку в UTF-8 с помощью Apache Commons

Пакет кодеков Apache Commons содержит простые кодеры и декодеры для различных форматов, таких как Base64 и Шестнадцатеричный . В дополнение к этим широко используемым кодерам и декодерам, пакет кодеков также поддерживает набор утилит фонетического кодирования .

Чтобы мы могли использовать кодек Apache Commons, нам нужно добавить его в наш проект в качестве внешней зависимости.

Используя Maven, давайте добавим зависимость в ваш файл:

commons-codeccommons-codec1.15

В качестве альтернативы, если вы используете Gradle:

compile 'commons-codec:commons-codec:1.15'

Теперь мы можем использовать служебные классы Apache Commons – и, как обычно, мы будем использовать класс .

Это позволяет нам преобразовывать строки в байты и из байтов, используя различные кодировки, требуемые спецификацией Java. Этот класс является нулевым и потокобезопасным, поэтому у нас есть дополнительный уровень защиты при работе со строками.

Для кодирования строки в UTF-8 с помощью класса Apache Common мы можем использовать метод , который работает так же, как метод с указанной :

String germanString = "Wie heißen Sie?"; // What's your name?
byte[] bytes = StringUtils.getBytesUtf8(germanString);
String utf8String = StringUtils.newStringUtf8(bytes);
System.out.println(utf8String);

Это приводит к:

Wie heißen Sie?

Или , вы можете использовать обычный класс из зависимости:

org.apache.commonscommons-lang3

Если вы используете Gradle:

implementation group: 'org.apache.commons', name: 'commons-lang3', version: ${version}

И теперь мы можем использовать почти тот же подход, что и с обычными строками:

String germanString = "Wie heißen Sie?"; // What's your name?
byte[] bytes = StringUtils.getBytes(germanString, StandardCharsets.UTF_8);
String utf8String = StringUtils.toEncodedString(bytes, StandardCharsets.UTF_8);
System.out.println(utf8String);

Благодаря этому подход является потокобезопасным и нулевым:

Wie heißen Sie?

Вывод

В этом уроке мы рассмотрели как кодировать строку Java в UTF-8 . Мы рассмотрели несколько подходов – ручное создание строки с использованием и управление ими, класс Java 7 , а также Apache Commons.

Копирование

Возможно несколькими способами.

Копирование массива путем итерации массива

Первый способ – это перебрать массив и скопировать каждое значение исходного массива в целевой массив. Вот как выглядит копирование массива с использованием этого метода:

int[] source = new int;
int[] dest   = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

for(int i=0; i < source.length; i++) {
    dest = source;
}

Первые два массива int созданы. Во-вторых, исходный массив инициализируется значениями от 0 до 9 (от 0 до длины массива минус 1). В-третьих, каждый элемент в исходном массиве копируется в целевой массив.

Копирование с помощью Arrays.copyOf()

Вот как выглядит копирование массива:

int[] source = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

int[] dest = Arrays.copyOf(source, source.length);

Метод Arrays.copyOf() принимает 2 параметра. Первый – это массив для копирования. Второй – это длина нового массива – можно использовать для указания количества копируемых элементов из исходного массива.

Копирование с использованием Arrays.copyOfRange()

Метод Arrays.copyOfRange() копирует диапазон массива, не обязательно полный массив. Процесс копирования с ним:

int[] source = new int;

for(int i=0; i < source.length; i++) {
    source = i;
}

int[] dest = Arrays.copyOfRange(source, 0, source.length);

Метод Arrays.copyOfRange() принимает 3 параметра. Первый – это массив для копирования. Второй  – это первый индекс в исходном массиве, который нужно включить в копию. Третий  – это последний индекс в исходном массиве, который будет включен в копию (исключено – поэтому передача 10 будет копировать до и включая индекс 9).

Массив строк Java в строку

Большую часть времени мы вызываем метод объекта, чтобы получить строковое представление. Давайте посмотрим, что происходит, когда мы вызываем метод для массива строк в java.

package com.journaldev.util;

public class JavaStringArrayToString {

	public static void main(String[] args) {
		String[] strArr = new String[] {"1","2","3"};
		
		String str = strArr.toString();
		
		System.out.println("Java String array to String = "+str);
	}

}

На рисунке ниже показан результат, полученный вышеуказанной программой.

Причина приведенного выше вывода заключается в том, что вызов массива приведет к суперклассу объектов, где он реализован, как показано ниже.

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

Пример преобразования массива строк Java в строку

Итак, как преобразовать массив строк в строку в java. Мы можем использовать метод , который вызывает метод toString() для отдельных элементов и использует StringBuilder для создания строки.

public static String toString(Object[] a) {
    if (a == null)
        return "null";

    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('));
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

Мы также можем создать ваш собственный метод преобразования массива строк в строку, если у нас есть определенные требования к формату.

Ниже приведена простая программа, показывающая эти методы в действии и полученные результаты.

package com.journaldev.util;

import java.util.Arrays;

public class JavaStringArrayToString {

	public static void main(String[] args) {
		String[] strArr = new String[] { "1", "2", "3" };

		String str = Arrays.toString(strArr);
		System.out.println("Java String array to String = " + str);

		str = convertStringArrayToString(strArr, ",");
		System.out.println("Convert Java String array to String = " + str);

	}

	private static String convertStringArrayToString(String[] strArr, String delimiter) {
		StringBuilder sb = new StringBuilder();
		for (String str : strArr)
			sb.append(str).append(delimiter);
		return sb.substring(0, sb.length() - 1);
	}
}

Поэтому, если мы используем метод array , он возвращает бесполезные данные.

Класс массивов Java предоставляет , который выполняет итерацию по элементам массива и использует их реализацию для возврата строкового представления массива. Вот почему, когда мы используем эту функцию, мы видим, что она печатает содержимое массива и может использоваться для ведения журнала.

Если вы хотите объединить все строковые элементы в массиве строк с определенным разделителем, вы можете использовать метод, который возвращает строку после их объединения.

Пример преобразования массива Java в строку

Теперь давайте расширим наш строковый массив до строкового примера для использования с любыми другими пользовательскими классами, вот реализация.

package com.journaldev.util;

import java.util.Arrays;

public class JavaArrayToString {

	public static void main(String[] args) {
		A[] arr = { new A("1"), new A("2"), new A("3") };

		// default toString() method
		System.out.println(arr.toString());

		// using Arrays.toString() for printing object array contents
		System.out.println(Arrays.toString(arr));

		// converting Object Array to String
		System.out.println(convertObjectArrayToString(arr, ","));
	}

	private static String convertObjectArrayToString(Object[] arr, String delimiter) {
		StringBuilder sb = new StringBuilder();
		for (Object obj : arr)
			sb.append(obj.toString()).append(delimiter);
		return sb.substring(0, sb.length() - 1);

	}

}

class A {
	private String name;

	public A(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		System.out.println("A toString() method called!!");
		return this.name;
	}
}

Вывод, полученный приведенной выше программой java array to String, является;


A toString() method called!!
A toString() method called!!
A toString() method called!!
1,2,3

Поэтому мы рассмотрели, как преобразовать массив строк Java в строку, а затем расширили его для использования с пользовательскими объектами. Это все для преобразования массива java в строку.

Ссылка:

Конвертировать с использованием StringBuffer или StringBuilder

StringBuilder и StringBuffer – это классы, используемые для объединения нескольких значений в одну строку. StringBuffer является потокобезопасным, но медленным, тогда как StringBuilder не является поточно-ориентированным, но работает быстрее.

Пример 1

class Method5
{
  public static void main(String args[]) 
  { 
    int number1 = -1234;
    StringBuilder sb = new StringBuilder(); 
    sb.append(number1); 
    String str1 = sb.toString(); 
    System.out.println("With StringBuilder method: string = " + str1); 
    StringBuffer SB = new StringBuffer(); 
    SB.append(number1); 
    String str2 = SB.toString(); 
    System.out.println("With StringBuffer method: string = " + str2); 
  } 
}

Вывод

With StringBuilder method: string = -1234
With StringBuffer method: string = -1234

Объект StringBuilder представляет объект String, который можно изменять и обрабатывать как массив с последовательностью символов. Чтобы добавить новый аргумент в конец строки, экземпляр StringBuilder реализует метод append().

Пример 2

class Method6
{
  public static void main(String args[]) 
  { 
	String str1 = new StringBuilder().append(1234).toString(); 
    System.out.println("With StringBuilder method: string = " + str1); 
    String str2 = new StringBuffer().append(1234).toString(); 
    System.out.println("With StringBuffer method: string = " + str2); 
  } 
}

Вывод

With StringBuilder method: string = -1234
With StringBuffer method: string = -1234

Наиболее важным является вызов метода toString(), чтобы получить строковое представление данных.

6 ответов

Лучший ответ

Поскольку я использовал одно из ваших регулярных выражений, которое вы упомянули в вопросе.

Настройте процессор ReplaceText как

Поиск значения

Восстановительная стоимость

Ввод:

Вывод:

Если вам известна схема данных, вы можете использовать процессор QueryRecord, а затем добавить новое свойство в QueryRecord процессор как

Затем процессор выводит потоковый файл с записями, которые удовлетворяют вышеуказанному SQL-запросу.

Используйте процессор ReplaceText со следующими настройками:

Поиск значения

Восстановительная стоимость

Набор символов

Максимальный размер буфера

Стратегия замены

Режим оценки

Я попытался с приведенными ниже данными в моем локальном экземпляре

содержание входного файла потока

содержимое выходного файла:

Обратитесь к этому ссылка для другого подхода для замены пустых строк в файле потока.

Shu
20 Сен 2018 в 00:25

Вы можете игнорировать эти пустые строки следующим образом.

Использование процессора ReplaceText.

Ссылка: Как использовать регулярные выражения для удаления пробелов между двумя рядами?

Дайте мне знать, если у вас возникнут какие-либо проблемы в этом.

Mahendra Prabhu
20 Сен 2018 в 10:04

Начиная с NiFi 1.7.0 (через NIFI-4456) вы можете настроить JsonTreeReader для чтения «один JSON на строку» в соответствии с вашим форматом. Затем вы можете использовать QueryRecord для выдачи SQL-запроса для маршрутизации записей так, как вам нравится, например, «неверное» свойство с запросом и «допустимое» свойство с запросом или что-то в этом роде.

mattyb
20 Сен 2018 в 15:00

Если все ваши записи будут основаны на строках, это можно решить с помощью Perl. Используя однострочное решение perl, мы можем использовать hex \ x22 для двойных кавычек. Посмотрите, работает ли нижеприведенное для вас. Я добавил пустые строки в дополнение к вашему вводу.

stack0114106
20 Сен 2018 в 10:40

Когда у вас есть (ваш файл преобразован в) файл Unix, вы можете использовать

Walter A
19 Сен 2018 в 21:16

Добавьте это к вашему второму регулярному выражению:

Удалить пустые строки, удалив символы новой строки, которым предшествует другая новая строка.

Andreas Zita
19 Сен 2018 в 20:27

Дополните строку с помощью библиотек

Кроме того, существуют внешние библиотеки, которые уже предлагают функции заполнения.

3.1. Apache Commons Lang

Apache Commons Lang предоставляет пакет служебных классов Java. Одним из самых популярных является StringUtils .

Чтобы использовать его, нам нужно будет включить его в наш проект, добавив к вашему pom.xml файл:

org.apache.commonscommons-lang33.11

А затем мы передаем входную строку и длину , как и созданные нами методы. Мы также можем передать символ заполнения:

assertEquals("    123456", StringUtils.leftPad("123456", 10));
assertEquals("0000123456", StringUtils.leftPad("123456", 10, "0"));

Опять же, строка | по умолчанию будет заполнена пробелами, или нам нужно явно установить другой символ pad.

Существуют также соответствующие методы right Pad () .

Чтобы узнать больше о функциях Apache Commons Lang3, вы можете ознакомиться с нашим вводным руководством . Если вы хотите увидеть другие способы манипулирования строкой с помощью класса StringUtils , пожалуйста, обратитесь к этой статье .

3.2. Google Guava

Еще одна библиотека, которую мы можем использовать, – это Google Guava . Конечно, сначала нам нужно добавить его в проект, добавив :

com.google.guavaguava27.0-jre

А затем используйте Strings class :

assertEquals("    123456", Strings.padStart("123456", 10, ' '));
assertEquals("0000123456", Strings.padStart("123456", 10, '0'));

В этом методе нет символа pad по умолчанию, поэтому нам нужно передавать его каждый раз.

Для правой панели мы можем использовать pad И() метод.

Библиотека Гуавы предлагает гораздо больше функций, и мы рассмотрели многие из них. Вы можете посмотреть здесь статьи, связанные с гуавой .

Преобразование строки в логическое или логическое значение

Чтобы преобразовать экземпляр String в примитивный boolean или Boolean тип оболочки, мы можем использовать parseBoolean() или значение() API соответственно:

@Test
public void whenConvertedToboolean_thenCorrect() {
    String beforeConvStr = "true";
    boolean afterConvBooleanPrimitive = true;

    assertEquals(Boolean.parseBoolean(beforeConvStr), afterConvBooleanPrimitive);
}

@Test
public void whenConvertedToBoolean_thenCorrect() {
    String beforeConvStr = "true";
    Boolean afterConvBoolean = true;

    assertEquals(Boolean.valueOf(beforeConvStr), afterConvBoolean);
}

Преобразование строки в дату или LocalDateTime

Java 6 предоставляет java.util.Дата тип данных для представления дат. Java 8 представила новые API для Даты и времени для устранения недостатков более старых java.util.Дата и java.util.Календарь .

8.1. Преобразование строки в java.util.Date

Чтобы преобразовать объекты String в объекты Date , нам нужно сначала построить объект SimpleDateFormat , передав шаблон, описывающий формат даты и времени.

Например, возможное значение для шаблона может быть “ММ-дд-гггг” или “гггг-ММ-дд”. Далее нам нужно вызвать parse метод, передающий Строку .

Строка |, переданная в качестве аргумента, должна быть в том же формате, что и шаблон. В противном случае во время выполнения будет выдано исключение ParseException

@Test
public void whenConvertedToDate_thenCorrect() throws ParseException {
    String beforeConvStr = "15/10/2013";
    int afterConvCalendarDay = 15;
    int afterConvCalendarMonth = 9;
    int afterConvCalendarYear = 2013;
    SimpleDateFormat formatter = new SimpleDateFormat("dd/M/yyyy");
    Date afterConvDate = formatter.parse(beforeConvStr);
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(afterConvDate);

    assertEquals(calendar.get(Calendar.DAY_OF_MONTH), afterConvCalendarDay);
    assertEquals(calendar.get(Calendar.MONTH), afterConvCalendarMonth);
    assertEquals(calendar.get(Calendar.YEAR), afterConvCalendarYear);
}

8.2. Преобразование строки в java.time.LocalDateTime

LocalDateTime -это неизменяемый объект даты и времени, который представляет время, часто рассматриваемое как год-месяц-день-час-минута-секунда.

Чтобы преобразовать строковые объекты в LocalDateTime объекты, мы можем просто использовать parse API:

@Test
public void whenConvertedToLocalDateTime_thenCorrect() {
    String str = "2007-12-03T10:15:30";
    int afterConvCalendarDay = 03;
    Month afterConvCalendarMonth = Month.DECEMBER;
    int afterConvCalendarYear = 2007;
    LocalDateTime afterConvDate 
      = new UseLocalDateTime().getLocalDateTimeUsingParseMethod(str);

    assertEquals(afterConvDate.getDayOfMonth(), afterConvCalendarDay);
    assertEquals(afterConvDate.getMonth(), afterConvCalendarMonth);
    assertEquals(afterConvDate.getYear(), afterConvCalendarYear);
}

Строка | должна представлять допустимое время в соответствии с форматом java.time.DateTimeFormatter.ISO_LOCAL_DATE_TIME В противном случае во время выполнения будет выдано исключение ParseException .

Например’ 2011-12-03 ‘ представляет допустимый формат строки, содержащий 4 цифры для года, 2 цифры для месяца в течение года и 2 цифры для дня месяца .

positionCaseInsensitiveUTF8

Такая же, как и , но работает без учета регистра. Возвращает позицию (в кодовых точках Unicode) найденной подстроки в строке, начиная с 1.

Работает при допущении, что строка содержит набор кодовых точек, представляющий текст в кодировке UTF-8. Если допущение не выполнено — то возвращает неопределенный результат (не кидает исключение). Если символ может быть представлен с помощью двух кодовых точек, он будет представлен двумя и так далее.

Синтаксис

Аргументы

  • — строка, по которой выполняется поиск. .
  • — подстрока, которую необходимо найти. .
  • — опциональный параметр, позиция символа в строке, с которого начинается поиск. UInt.

Возвращаемые значения

  • Начальная позиция в байтах (начиная с 1), если подстрока найдена.
  • 0, если подстрока не найдена.

Тип: .

Пример

Запрос:

Результат:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: